I ended up with a solution that looks much like your example. Simpler than metaprogramming (maybe this is metaprogramming?!) Not sure exactly what is going on under the covers - but it seems to give a lot of flexibility for data-driven tests. The tests run very fast and the failure messages are easy to decipher. Looks like you can load datasets from the filesystem - I’ve got a files with ~22K test examples. Just saved a lot of typing! ![]()
defmodule StemEx.StepsTest do
use ExUnit.Case, async: true
functions = %{
step1a: &StemEx.Steps.step1a/1 ,
step1b: &StemEx.Steps.step1b/1 ,
}
values = [
[:step1a , "caresses" , "caress" ],
[:step1a , "ponies" , "poni" ],
[:step1a , "ties" , "ti" ],
[:step1a , "caress" , "caress" ],
[:step1a , "cats" , "cat" ],
[:step1b , "feed" , "feed" ],
[:step1b , "agreed" , "agree" ],
[:step1b , "plastered" , "plaster" ],
[:step1b , "bled" , "bled" ],
[:step1b , "motoring" , "motoring"],
[:step1b , "sing" , "sing" ],
]
for [label, input, output] <- values do
@label label
@input input
@output output
@func functions[@label]
test "#{label}: '#{input}' has output of '#{output}'" do
assert @func.(@input) == @output
end
end
end






















