diff --git a/bin/generate-spec b/bin/generate-spec index ada3fa0..a867b08 100755 --- a/bin/generate-spec +++ b/bin/generate-spec @@ -50,7 +50,9 @@ included_tests_from_toml = (path) -> -- functions marked as global so spec_generators can see them export indent, quote, is_json_null, is_empty, contains -indent = (text, level) -> string.rep(' ', level) .. text +indent = (text, level) -> + error 'Provide a level for `indent`', 2 if not level + string.rep(' ', level) .. text quote = (str) -> if str\find "'" diff --git a/exercises/practice/all-your-base/.meta/spec_generator.moon b/exercises/practice/all-your-base/.meta/spec_generator.moon index 52e3a41..f0667da 100644 --- a/exercises/practice/all-your-base/.meta/spec_generator.moon +++ b/exercises/practice/all-your-base/.meta/spec_generator.moon @@ -1,4 +1,4 @@ -list_of_digits = (digits) -> "{#{table.concat digits, ', '}}" +import int_list from require 'test_helpers' { module_imports: {'rebase'}, @@ -7,13 +7,13 @@ list_of_digits = (digits) -> "{#{table.concat digits, ', '}}" local lines if not case.expected.error lines = { - "result = rebase in_base: #{case.input.inputBase}, out_base: #{case.input.outputBase}, digits: #{list_of_digits case.input.digits}", - "expected = #{list_of_digits case.expected}", + "result = rebase in_base: #{case.input.inputBase}, out_base: #{case.input.outputBase}, digits: #{int_list case.input.digits}", + "expected = #{int_list case.expected}", "assert.are.same expected, result" } else lines = { - "f = -> rebase in_base: #{case.input.inputBase}, out_base: #{case.input.outputBase}, digits: #{list_of_digits case.input.digits}", + "f = -> rebase in_base: #{case.input.inputBase}, out_base: #{case.input.outputBase}, digits: #{int_list case.input.digits}", "assert.has.errors f, #{quote case.expected.error}" } diff --git a/exercises/practice/allergies/.meta/spec_generator.moon b/exercises/practice/allergies/.meta/spec_generator.moon index f3b9bdc..2dd9afe 100644 --- a/exercises/practice/allergies/.meta/spec_generator.moon +++ b/exercises/practice/allergies/.meta/spec_generator.moon @@ -1,5 +1,4 @@ -str_list = (list) -> - "{#{table.concat [quote word for word in *list], ', '}}" +import word_list from require 'test_helpers' { module_name: 'Allergies', @@ -15,7 +14,7 @@ str_list = (list) -> when 'list' lines = { "result = Allergies.list #{case.input.score}", - "expected = #{str_list case.expected}", + "expected = #{word_list case.expected}", "assert.is.same expected, result", } table.concat [indent line, level for line in *lines], '\n' diff --git a/exercises/practice/anagram/.meta/spec_generator.moon b/exercises/practice/anagram/.meta/spec_generator.moon index 429f9cb..dfb197d 100644 --- a/exercises/practice/anagram/.meta/spec_generator.moon +++ b/exercises/practice/anagram/.meta/spec_generator.moon @@ -1,12 +1,11 @@ -list_of_words = (list) -> - "{#{table.concat [quote word for word in *list], ', '}}" +import word_list from require 'test_helpers' { module_name: 'find_anagrams', generate_test: (case, level) -> lines = { - "result = find_anagrams #{quote case.input.subject}, #{list_of_words case.input.candidates}", - "expected = #{list_of_words case.expected}", + "result = find_anagrams #{quote case.input.subject}, #{word_list case.input.candidates}", + "expected = #{word_list case.expected}", "assert.are.same expected, result" } table.concat [indent line, level for line in *lines], '\n' diff --git a/exercises/practice/baffling-birthdays/.meta/spec_generator.moon b/exercises/practice/baffling-birthdays/.meta/spec_generator.moon index 6e3afc0..2a7e68f 100644 --- a/exercises/practice/baffling-birthdays/.meta/spec_generator.moon +++ b/exercises/practice/baffling-birthdays/.meta/spec_generator.moon @@ -1,9 +1,5 @@ tablex = require 'pl.tablex' - -int_list = (list) -> "{#{table.concat list, ', '}}" - -string_list = (list) -> - "{#{table.concat [quote word for word in *list], ', '}}" +import int_list, word_list from require 'test_helpers' { module_name: 'BafflingBirthdays', @@ -13,7 +9,7 @@ string_list = (list) -> switch case.property when 'sharedBirthday' lines = { - "birthdates = #{string_list case.input.birthdates}", + "birthdates = #{word_list case.input.birthdates}", "assert.is.#{case.expected} BafflingBirthdays.#{case.property} birthdates", } when 'estimatedProbabilityOfSharedBirthday' @@ -68,7 +64,7 @@ string_list = (list) -> tablex = require 'pl.tablex' -- - epsilon = 0.5 + epsilon = 1.0 is_close_to = (state, arguments) -> {a, b} = arguments math.abs(a - b) <= epsilon diff --git a/exercises/practice/baffling-birthdays/baffling_birthdays_spec.moon b/exercises/practice/baffling-birthdays/baffling_birthdays_spec.moon index 08f6539..8f6196c 100644 --- a/exercises/practice/baffling-birthdays/baffling_birthdays_spec.moon +++ b/exercises/practice/baffling-birthdays/baffling_birthdays_spec.moon @@ -6,7 +6,7 @@ describe 'baffling-birthdays', -> tablex = require 'pl.tablex' -- - epsilon = 0.5 + epsilon = 1.0 is_close_to = (state, arguments) -> {a, b} = arguments math.abs(a - b) <= epsilon diff --git a/exercises/practice/binary-search-tree/.meta/spec_generator.moon b/exercises/practice/binary-search-tree/.meta/spec_generator.moon index 3be3d88..42a666a 100644 --- a/exercises/practice/binary-search-tree/.meta/spec_generator.moon +++ b/exercises/practice/binary-search-tree/.meta/spec_generator.moon @@ -1,5 +1,6 @@ stringx = require 'pl.stringx' import dump from require 'moon' +import word_list from require 'test_helpers' bst = (t, level) -> dumped = dump t @@ -7,10 +8,6 @@ bst = (t, level) -> lines = [indent line, level for line in *(stringx.splitlines dumped)] table.concat(lines, "\n")\gsub('{%s+}', 'nil')\gsub('^%s+', '') -string_list = (list) -> - "{#{table.concat [quote word for word in *list], ', '}}" - - { module_name: 'BinarySearchTree', @@ -19,16 +16,16 @@ string_list = (list) -> switch case.property when 'data' lines = { - "tree = BinarySearchTree #{string_list case.input.treeData}" + "tree = BinarySearchTree #{word_list case.input.treeData}" "result = tree\\data!" "expected = #{bst case.expected, level}", "assert.are.same expected, result" } when 'sortedData' lines = { - "tree = BinarySearchTree #{string_list case.input.treeData}" + "tree = BinarySearchTree #{word_list case.input.treeData}" "result = tree\\sorted!" - "expected = #{string_list case.expected}", + "expected = #{word_list case.expected}", "assert.are.same expected, result" } table.concat [indent line, level for line in *lines], '\n' diff --git a/exercises/practice/binary-search-tree/binary_search_tree_spec.moon b/exercises/practice/binary-search-tree/binary_search_tree_spec.moon index a0d345e..4eaf115 100644 --- a/exercises/practice/binary-search-tree/binary_search_tree_spec.moon +++ b/exercises/practice/binary-search-tree/binary_search_tree_spec.moon @@ -5,9 +5,9 @@ describe 'binary-search-tree', -> tree = BinarySearchTree {'4'} result = tree\data! expected = { + left: nil right: nil data: "4" - left: nil } assert.are.same expected, result @@ -16,13 +16,13 @@ describe 'binary-search-tree', -> tree = BinarySearchTree {'4', '2'} result = tree\data! expected = { - right: nil - data: "4" left: { + left: nil right: nil data: "2" - left: nil } + right: nil + data: "4" } assert.are.same expected, result @@ -30,13 +30,13 @@ describe 'binary-search-tree', -> tree = BinarySearchTree {'4', '4'} result = tree\data! expected = { - right: nil - data: "4" left: { + left: nil right: nil data: "4" - left: nil } + right: nil + data: "4" } assert.are.same expected, result @@ -44,13 +44,13 @@ describe 'binary-search-tree', -> tree = BinarySearchTree {'4', '5'} result = tree\data! expected = { + left: nil right: { + left: nil right: nil data: "5" - left: nil } data: "4" - left: nil } assert.are.same expected, result @@ -58,33 +58,33 @@ describe 'binary-search-tree', -> tree = BinarySearchTree {'4', '2', '6', '1', '3', '5', '7'} result = tree\data! expected = { - right: { - right: { - right: nil - data: "7" - left: nil - } - data: "6" + left: { left: { - right: nil - data: "5" left: nil + right: nil + data: "1" } - } - data: "4" - left: { right: { + left: nil right: nil data: "3" - left: nil } data: "2" + } + right: { left: { + left: nil right: nil - data: "1" + data: "5" + } + right: { left: nil + right: nil + data: "7" } + data: "6" } + data: "4" } assert.are.same expected, result diff --git a/exercises/practice/book-store/.meta/spec_generator.moon b/exercises/practice/book-store/.meta/spec_generator.moon index ffa8ca4..72547e8 100644 --- a/exercises/practice/book-store/.meta/spec_generator.moon +++ b/exercises/practice/book-store/.meta/spec_generator.moon @@ -1,4 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" +import int_list from require 'test_helpers' { module_name: 'BookStore', diff --git a/exercises/practice/camicia/.meta/spec_generator.moon b/exercises/practice/camicia/.meta/spec_generator.moon index b3fea95..76cfb03 100644 --- a/exercises/practice/camicia/.meta/spec_generator.moon +++ b/exercises/practice/camicia/.meta/spec_generator.moon @@ -1,12 +1,12 @@ -string_list = (list) -> "{#{table.concat [quote(v) for v in *list], ', '}}" +import word_list from require 'test_helpers' { module_name: 'Camicia' generate_test: (case, level) -> lines = { - "playerA = #{string_list case.input.playerA}" - "playerB = #{string_list case.input.playerB}" + "playerA = #{word_list case.input.playerA}" + "playerB = #{word_list case.input.playerB}" "expected = {" " status: #{quote case.expected.status}" " cards: #{case.expected.cards}" diff --git a/exercises/practice/custom-set/.meta/spec_generator.moon b/exercises/practice/custom-set/.meta/spec_generator.moon index e1dbf0c..270ee00 100644 --- a/exercises/practice/custom-set/.meta/spec_generator.moon +++ b/exercises/practice/custom-set/.meta/spec_generator.moon @@ -1,4 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" +import int_list from require 'test_helpers' { module_name: 'CustomSet', diff --git a/exercises/practice/diamond/.meta/spec_generator.moon b/exercises/practice/diamond/.meta/spec_generator.moon index 837b715..6d46f78 100644 --- a/exercises/practice/diamond/.meta/spec_generator.moon +++ b/exercises/practice/diamond/.meta/spec_generator.moon @@ -1,16 +1,13 @@ +import string_list from require 'test_helpers' + { module_name: 'Diamond' generate_test: (case, level) -> - lines = {} - table.insert lines, "result = Diamond.#{case.property} #{quote case.input.letter}" - - rows = [indent quote(row), level + 1 for row in *case.expected] - table.insert rows, 1, '{' - table.insert rows, indent('}', level) - - table.insert lines, "expected = #{table.concat rows, '\n'}" - table.insert lines, "assert.are.same expected, result" - + lines = { + "result = Diamond.#{case.property} #{quote case.input.letter}" + "expected = #{string_list case.expected, level}" + "assert.are.same expected, result" + } table.concat [indent line, level for line in *lines], '\n' } diff --git a/exercises/practice/diamond/diamond_spec.moon b/exercises/practice/diamond/diamond_spec.moon index 8c9f0be..41fc551 100644 --- a/exercises/practice/diamond/diamond_spec.moon +++ b/exercises/practice/diamond/diamond_spec.moon @@ -3,97 +3,95 @@ Diamond = require 'diamond' describe 'diamond', -> it "Degenerate case with a single 'A' row", -> result = Diamond.rows 'A' - expected = { - 'A' - } + expected = {'A'} assert.are.same expected, result pending 'Degenerate case with no row containing 3 distinct groups of spaces', -> result = Diamond.rows 'B' expected = { - ' A ' - 'B B' - ' A ' + ' A ', + 'B B', + ' A ', } assert.are.same expected, result pending 'Smallest non-degenerate case with odd diamond side length', -> result = Diamond.rows 'C' expected = { - ' A ' - ' B B ' - 'C C' - ' B B ' - ' A ' + ' A ', + ' B B ', + 'C C', + ' B B ', + ' A ', } assert.are.same expected, result pending 'Smallest non-degenerate case with even diamond side length', -> result = Diamond.rows 'D' expected = { - ' A ' - ' B B ' - ' C C ' - 'D D' - ' C C ' - ' B B ' - ' A ' + ' A ', + ' B B ', + ' C C ', + 'D D', + ' C C ', + ' B B ', + ' A ', } assert.are.same expected, result pending 'Largest possible diamond', -> result = Diamond.rows 'Z' expected = { - ' A ' - ' B B ' - ' C C ' - ' D D ' - ' E E ' - ' F F ' - ' G G ' - ' H H ' - ' I I ' - ' J J ' - ' K K ' - ' L L ' - ' M M ' - ' N N ' - ' O O ' - ' P P ' - ' Q Q ' - ' R R ' - ' S S ' - ' T T ' - ' U U ' - ' V V ' - ' W W ' - ' X X ' - ' Y Y ' - 'Z Z' - ' Y Y ' - ' X X ' - ' W W ' - ' V V ' - ' U U ' - ' T T ' - ' S S ' - ' R R ' - ' Q Q ' - ' P P ' - ' O O ' - ' N N ' - ' M M ' - ' L L ' - ' K K ' - ' J J ' - ' I I ' - ' H H ' - ' G G ' - ' F F ' - ' E E ' - ' D D ' - ' C C ' - ' B B ' - ' A ' + ' A ', + ' B B ', + ' C C ', + ' D D ', + ' E E ', + ' F F ', + ' G G ', + ' H H ', + ' I I ', + ' J J ', + ' K K ', + ' L L ', + ' M M ', + ' N N ', + ' O O ', + ' P P ', + ' Q Q ', + ' R R ', + ' S S ', + ' T T ', + ' U U ', + ' V V ', + ' W W ', + ' X X ', + ' Y Y ', + 'Z Z', + ' Y Y ', + ' X X ', + ' W W ', + ' V V ', + ' U U ', + ' T T ', + ' S S ', + ' R R ', + ' Q Q ', + ' P P ', + ' O O ', + ' N N ', + ' M M ', + ' L L ', + ' K K ', + ' J J ', + ' I I ', + ' H H ', + ' G G ', + ' F F ', + ' E E ', + ' D D ', + ' C C ', + ' B B ', + ' A ', } assert.are.same expected, result diff --git a/exercises/practice/etl/.meta/spec_generator.moon b/exercises/practice/etl/.meta/spec_generator.moon index 5f473d7..0d881b2 100644 --- a/exercises/practice/etl/.meta/spec_generator.moon +++ b/exercises/practice/etl/.meta/spec_generator.moon @@ -1,4 +1,4 @@ -string_list = (list) -> "{#{table.concat [quote(v) for v in *list], ', '}}" +import word_list from require 'test_helpers' { module_name: 'Etl', @@ -10,7 +10,7 @@ string_list = (list) -> "{#{table.concat [quote(v) for v in *list], ', '}}" keys = [k for k, _ in pairs case.input.legacy] table.sort keys for k in *keys - table.insert lines, " #{quote k}: #{string_list case.input.legacy[k]}" + table.insert lines, " #{quote k}: #{word_list case.input.legacy[k]}" table.insert lines, "}" table.insert lines, "expected = {" diff --git a/exercises/practice/flatten-array/.meta/spec_generator.moon b/exercises/practice/flatten-array/.meta/spec_generator.moon index b6fe728..329e686 100644 --- a/exercises/practice/flatten-array/.meta/spec_generator.moon +++ b/exercises/practice/flatten-array/.meta/spec_generator.moon @@ -1,10 +1,6 @@ -json = (require 'dkjson').use_lpeg! - -int_list = (list) -> "{#{table.concat list, ', '}}" - -- A simple way to render an arbitrary list of lists is to stringify it -- and then munge the string into a Lua table literal. - +json = (require 'dkjson').use_lpeg! nested_lists = (list) -> a = json.encode list a = a\gsub '%[', '{' @@ -13,6 +9,7 @@ nested_lists = (list) -> a = a\gsub 'null', '"null"' a +import int_list from require 'test_helpers' { module_imports: {'flatten'}, diff --git a/exercises/practice/flower-field/.meta/spec_generator.moon b/exercises/practice/flower-field/.meta/spec_generator.moon index ba643e1..283995e 100755 --- a/exercises/practice/flower-field/.meta/spec_generator.moon +++ b/exercises/practice/flower-field/.meta/spec_generator.moon @@ -1,27 +1,13 @@ +import string_list from require 'test_helpers' { module_name: 'FlowerField' generate_test: (case, level) -> - lines = {} - - if #case.input.garden == 0 - table.insert lines, "garden = {}" - else - table.insert(lines, "garden = {") - for row in *case.input.garden - table.insert(lines, " #{quote row}") - table.insert(lines, "}") - - if #case.expected == 0 - table.insert lines, "expected = {}" - else - table.insert(lines, "expected = {") - for row in *case.expected - table.insert(lines, " #{quote row}") - table.insert(lines, "}") - - table.insert(lines, "result = FlowerField.#{case.property} garden") - table.insert(lines, "assert.are.same expected, result") - + lines = { + "garden = #{string_list case.input.garden, level}" + "expected = #{string_list case.expected, level}" + "result = FlowerField.#{case.property} garden" + "assert.are.same expected, result" + } table.concat [indent line, level for line in *lines], '\n' } diff --git a/exercises/practice/flower-field/flower_field_spec.moon b/exercises/practice/flower-field/flower_field_spec.moon index bebacbb..fd6f0f1 100644 --- a/exercises/practice/flower-field/flower_field_spec.moon +++ b/exercises/practice/flower-field/flower_field_spec.moon @@ -8,171 +8,155 @@ describe 'flower-field', -> assert.are.same expected, result pending 'no columns', -> - garden = { - '' - } - expected = { - '' - } + garden = {''} + expected = {''} result = FlowerField.annotate garden assert.are.same expected, result pending 'no flowers', -> garden = { - ' ' - ' ' - ' ' + ' ', + ' ', + ' ', } expected = { - ' ' - ' ' - ' ' + ' ', + ' ', + ' ', } result = FlowerField.annotate garden assert.are.same expected, result pending 'garden full of flowers', -> garden = { - '***' - '***' - '***' + '***', + '***', + '***', } expected = { - '***' - '***' - '***' + '***', + '***', + '***', } result = FlowerField.annotate garden assert.are.same expected, result pending 'flower surrounded by spaces', -> garden = { - ' ' - ' * ' - ' ' + ' ', + ' * ', + ' ', } expected = { - '111' - '1*1' - '111' + '111', + '1*1', + '111', } result = FlowerField.annotate garden assert.are.same expected, result pending 'space surrounded by flowers', -> garden = { - '***' - '* *' - '***' + '***', + '* *', + '***', } expected = { - '***' - '*8*' - '***' + '***', + '*8*', + '***', } result = FlowerField.annotate garden assert.are.same expected, result pending 'horizontal line', -> - garden = { - ' * * ' - } - expected = { - '1*2*1' - } + garden = {' * * '} + expected = {'1*2*1'} result = FlowerField.annotate garden assert.are.same expected, result pending 'horizontal line, flowers at edges', -> - garden = { - '* *' - } - expected = { - '*1 1*' - } + garden = {'* *'} + expected = {'*1 1*'} result = FlowerField.annotate garden assert.are.same expected, result pending 'vertical line', -> garden = { - ' ' - '*' - ' ' - '*' - ' ' + ' ', + '*', + ' ', + '*', + ' ', } expected = { - '1' - '*' - '2' - '*' - '1' + '1', + '*', + '2', + '*', + '1', } result = FlowerField.annotate garden assert.are.same expected, result pending 'vertical line, flowers at edges', -> garden = { - '*' - ' ' - ' ' - ' ' - '*' + '*', + ' ', + ' ', + ' ', + '*', } expected = { - '*' - '1' - ' ' - '1' - '*' + '*', + '1', + ' ', + '1', + '*', } result = FlowerField.annotate garden assert.are.same expected, result pending 'cross', -> garden = { - ' * ' - ' * ' - '*****' - ' * ' - ' * ' + ' * ', + ' * ', + '*****', + ' * ', + ' * ', } expected = { - ' 2*2 ' - '25*52' - '*****' - '25*52' - ' 2*2 ' + ' 2*2 ', + '25*52', + '*****', + '25*52', + ' 2*2 ', } result = FlowerField.annotate garden assert.are.same expected, result pending 'large garden', -> garden = { - ' * * ' - ' * ' - ' * ' - ' * *' - ' * * ' - ' ' + ' * * ', + ' * ', + ' * ', + ' * *', + ' * * ', + ' ', } expected = { - '1*22*1' - '12*322' - ' 123*2' - '112*4*' - '1*22*2' - '111111' + '1*22*1', + '12*322', + ' 123*2', + '112*4*', + '1*22*2', + '111111', } result = FlowerField.annotate garden assert.are.same expected, result pending 'multiple adjacent flowers', -> - garden = { - ' ** ' - } - expected = { - '1**1' - } + garden = {' ** '} + expected = {'1**1'} result = FlowerField.annotate garden assert.are.same expected, result diff --git a/exercises/practice/food-chain/.meta/spec_generator.moon b/exercises/practice/food-chain/.meta/spec_generator.moon index b653bff..af4b134 100644 --- a/exercises/practice/food-chain/.meta/spec_generator.moon +++ b/exercises/practice/food-chain/.meta/spec_generator.moon @@ -1,11 +1,4 @@ -string_list = (list, level) -> - if #list <= 2 - "{#{table.concat [quote elem for elem in *list], ', '}}" - else - lines = [indent quote(elem) .. ',', level + 1 for elem in *list] - table.insert lines, 1, '{' - table.insert lines, indent('}', level) - table.concat lines, '\n' +import string_list from require 'test_helpers' { module_name: 'FoodChain', diff --git a/exercises/practice/forth/.meta/spec_generator.moon b/exercises/practice/forth/.meta/spec_generator.moon index 8a9628c..0c921af 100644 --- a/exercises/practice/forth/.meta/spec_generator.moon +++ b/exercises/practice/forth/.meta/spec_generator.moon @@ -1,19 +1,4 @@ -table_contains = (list, target) -> - for elem in *list - return true if elem == target - false - -int_list = (list) -> "{#{table.concat list, ', '}}" - -instruction_list = (list, level) -> - if #list <= 2 - "{#{table.concat [quote elem for elem in *list], ', '}}" - else - instrs = [indent quote(elem) .. ',', level + 1 for elem in *list] - table.insert instrs, 1, '{' - table.insert instrs, indent('}', level) - table.concat instrs, '\n' - +import int_list, string_list, table_contains from require 'test_helpers' { module_name: 'Forth', @@ -24,8 +9,8 @@ instruction_list = (list, level) -> lines = { "interp1 = Forth!", "interp2 = Forth!", - "interp1\\evaluate #{instruction_list case.input.instructionsFirst, level}", - "interp2\\evaluate #{instruction_list case.input.instructionsSecond, level}", + "interp1\\evaluate #{string_list case.input.instructionsFirst, level}", + "interp2\\evaluate #{string_list case.input.instructionsSecond, level}", "assert.are.same #{int_list case.expected[1]}, interp1\\stack!", "assert.are.same #{int_list case.expected[2]}, interp2\\stack!", } @@ -33,7 +18,7 @@ instruction_list = (list, level) -> else lines = { 'interpreter = Forth!', - "instructions = #{instruction_list case.input.instructions, level}", + "instructions = #{string_list case.input.instructions, level}", } if case.expected.error diff --git a/exercises/practice/grade-school/.meta/spec_generator.moon b/exercises/practice/grade-school/.meta/spec_generator.moon index 6754809..fa3dd34 100644 --- a/exercises/practice/grade-school/.meta/spec_generator.moon +++ b/exercises/practice/grade-school/.meta/spec_generator.moon @@ -1,15 +1,11 @@ +import bool_list, word_list from require 'test_helpers' + student_grade = (t) -> "{#{quote t[1]}, #{t[2]}}" student_grade_list = (list) -> students = [student_grade e for e in *list] "{#{table.concat students, ', '}}" -string_list = (list) -> - "{#{table.concat [quote word for word in *list], ', '}}" - -bool_list = (list) -> - "{#{table.concat [tostring b for b in *list], ', '}}" - { module_imports: {'roster', 'add', 'grade'} @@ -20,7 +16,7 @@ bool_list = (list) -> when 'roster' lines = { "result = roster #{student_grade_list case.input.students}" - "expected = #{string_list case.expected}" + "expected = #{word_list case.expected}" } when 'add' lines = { @@ -30,7 +26,7 @@ bool_list = (list) -> when 'grade' lines = { "result = grade #{student_grade_list case.input.students}, #{case.input.desiredGrade}" - "expected = #{string_list case.expected}" + "expected = #{word_list case.expected}" } table.insert lines, 'assert.are.same expected, result' diff --git a/exercises/practice/hamming/.meta/spec_generator.moon b/exercises/practice/hamming/.meta/spec_generator.moon index b8ea574..239d03a 100644 --- a/exercises/practice/hamming/.meta/spec_generator.moon +++ b/exercises/practice/hamming/.meta/spec_generator.moon @@ -4,12 +4,12 @@ local lines if type(case.expected) == "number" lines = { - "result = hamming.distance '#{case.input.strand1}', '#{case.input.strand2}'", + "result = hamming.distance #{quote case.input.strand1}, #{quote case.input.strand2}", "assert.are.equal #{case.expected}, result" } else lines = { - "f = -> hamming.distance '#{case.input.strand1}', '#{case.input.strand2}'", + "f = -> hamming.distance #{quote case.input.strand1}, #{quote case.input.strand2}", "assert.has.error f, '#{case.expected.error}'" } diff --git a/exercises/practice/high-scores/.meta/spec_generator.moon b/exercises/practice/high-scores/.meta/spec_generator.moon index 64baf1d..65386bb 100644 --- a/exercises/practice/high-scores/.meta/spec_generator.moon +++ b/exercises/practice/high-scores/.meta/spec_generator.moon @@ -1,5 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" - +import int_list from require 'test_helpers' { module_name: 'HighScores', diff --git a/exercises/practice/house/.meta/spec_generator.moon b/exercises/practice/house/.meta/spec_generator.moon index d7b6d7e..c8d308d 100644 --- a/exercises/practice/house/.meta/spec_generator.moon +++ b/exercises/practice/house/.meta/spec_generator.moon @@ -1,11 +1,4 @@ -string_list = (list, level) -> - if #list <= 2 - "{#{table.concat [quote elem for elem in *list], ', '}}" - else - instrs = [indent quote(elem) .. ',', level + 1 for elem in *list] - table.insert instrs, 1, '{' - table.insert instrs, indent('}', level) - table.concat instrs, '\n' +import string_list from require 'test_helpers' { module_name: 'House', diff --git a/exercises/practice/markdown/.meta/spec_generator.moon b/exercises/practice/markdown/.meta/spec_generator.moon index b3f5d4e..5c5f6e1 100644 --- a/exercises/practice/markdown/.meta/spec_generator.moon +++ b/exercises/practice/markdown/.meta/spec_generator.moon @@ -1,5 +1,4 @@ -json = require 'dkjson' -json_string = (s) -> json.encode s +import json_string from require 'test_helpers' { module_name: 'Markdown', diff --git a/exercises/practice/matrix/.meta/spec_generator.moon b/exercises/practice/matrix/.meta/spec_generator.moon index ad2253d..467ed8f 100644 --- a/exercises/practice/matrix/.meta/spec_generator.moon +++ b/exercises/practice/matrix/.meta/spec_generator.moon @@ -1,8 +1,4 @@ -json = require 'dkjson' -json_string = (s) -> json.encode s - -int_list = (list) -> "{#{table.concat list, ', '}}" - +import json_string, int_list from require 'test_helpers' { module_name: 'Matrix', diff --git a/exercises/practice/meetup/.meta/spec_generator.moon b/exercises/practice/meetup/.meta/spec_generator.moon index 79532eb..f2acca7 100644 --- a/exercises/practice/meetup/.meta/spec_generator.moon +++ b/exercises/practice/meetup/.meta/spec_generator.moon @@ -1,13 +1,12 @@ -table.tostring = (t) -> - s = [string.format '%s: %q', k, v for k, v in pairs t] - "{#{table.concat s, ', '}}" +import table_tostring_ordered from require 'test_helpers' +keys = {'year', 'month', 'week', 'dayofweek'} { - module_imports: {'meetup'}, + module_imports: {'meetup'} generate_test: (case, level) -> lines = { - "result = meetup #{table.tostring case.input}" + "result = meetup #{table_tostring_ordered case.input, keys}" "expected = #{quote case.expected}" "assert.are.equal expected, result" } diff --git a/exercises/practice/nucleotide-count/.meta/spec_generator.moon b/exercises/practice/nucleotide-count/.meta/spec_generator.moon index db3ecd1..2b89cc2 100644 --- a/exercises/practice/nucleotide-count/.meta/spec_generator.moon +++ b/exercises/practice/nucleotide-count/.meta/spec_generator.moon @@ -1,3 +1,5 @@ +import table_tostring_ordered from require 'test_helpers' + { module_name: 'nucleotide_count', @@ -11,7 +13,7 @@ else -- use "same", not "equal", to compare tables lines = { - "expected = A: #{case.expected.A}, C: #{case.expected.C}, G: #{case.expected.G}, T: #{case.expected.T}" + "expected = #{table_tostring_ordered case.expected, {'A','C','G','T'}}" "result = nucleotide_count '#{case.input.strand}'", "assert.are.same expected, result" } diff --git a/exercises/practice/nucleotide-count/nucleotide_count_spec.moon b/exercises/practice/nucleotide-count/nucleotide_count_spec.moon index cc18d9c..47a4a10 100644 --- a/exercises/practice/nucleotide-count/nucleotide_count_spec.moon +++ b/exercises/practice/nucleotide-count/nucleotide_count_spec.moon @@ -2,22 +2,22 @@ nucleotide_count = require 'nucleotide_count' describe 'nucleotide-count', -> it 'empty strand', -> - expected = A: 0, C: 0, G: 0, T: 0 + expected = {A: 0, C: 0, G: 0, T: 0} result = nucleotide_count '' assert.are.same expected, result pending 'can count one nucleotide in single-character input', -> - expected = A: 0, C: 0, G: 1, T: 0 + expected = {A: 0, C: 0, G: 1, T: 0} result = nucleotide_count 'G' assert.are.same expected, result pending 'strand with repeated nucleotide', -> - expected = A: 0, C: 0, G: 7, T: 0 + expected = {A: 0, C: 0, G: 7, T: 0} result = nucleotide_count 'GGGGGGG' assert.are.same expected, result pending 'strand with multiple nucleotides', -> - expected = A: 20, C: 12, G: 17, T: 21 + expected = {A: 20, C: 12, G: 17, T: 21} result = nucleotide_count 'AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC' assert.are.same expected, result diff --git a/exercises/practice/palindrome-products/.meta/spec_generator.moon b/exercises/practice/palindrome-products/.meta/spec_generator.moon index b8a54c1..6fdb38a 100644 --- a/exercises/practice/palindrome-products/.meta/spec_generator.moon +++ b/exercises/practice/palindrome-products/.meta/spec_generator.moon @@ -1,7 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" - -int_lists = (lists) -> - "{#{table.concat [int_list list for list in *lists], ', '}}" +import int_list, int_lists from require 'test_helpers' value = (val) -> if is_json_null val @@ -23,7 +20,7 @@ value = (val) -> lines = { "palindrome, factors = PalindromeProducts.#{case.property} #{case.input.min}, #{case.input.max}", "expected_palindrome = #{value case.expected.value}", - "expected_factors = #{int_lists case.expected.factors}", + "expected_factors = #{int_lists case.expected.factors, level}", "assert.are.equal expected_palindrome, palindrome", "assert.are.same expected_factors, factors", } diff --git a/exercises/practice/palindrome-products/palindrome_products_spec.moon b/exercises/practice/palindrome-products/palindrome_products_spec.moon index e58bef9..ccdf035 100644 --- a/exercises/practice/palindrome-products/palindrome_products_spec.moon +++ b/exercises/practice/palindrome-products/palindrome_products_spec.moon @@ -11,7 +11,10 @@ describe 'palindrome-products', -> pending 'find the largest palindrome from single digit factors', -> palindrome, factors = PalindromeProducts.largest 1, 9 expected_palindrome = 9 - expected_factors = {{1, 9}, {3, 3}} + expected_factors = { + {1, 9}, + {3, 3}, + } assert.are.equal expected_palindrome, palindrome assert.are.same expected_factors, factors diff --git a/exercises/practice/pascals-triangle/.meta/spec_generator.moon b/exercises/practice/pascals-triangle/.meta/spec_generator.moon index b6ef255..7d7095e 100644 --- a/exercises/practice/pascals-triangle/.meta/spec_generator.moon +++ b/exercises/practice/pascals-triangle/.meta/spec_generator.moon @@ -1,16 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" - -int_lists = (lists, level) -> - if #lists == 0 - '{}' - elseif #lists == 1 - "{#{int_list lists[1]}}" - else - rows = [indent int_list(row) .. ',', level + 1 for row in *lists] - table.insert rows, 1, '{' - table.insert rows, indent '}', level - table.concat rows, '\n' - +import int_lists from require 'test_helpers' { module_name: 'PascalsTriangle', diff --git a/exercises/practice/protein-translation/.meta/spec_generator.moon b/exercises/practice/protein-translation/.meta/spec_generator.moon index 11de3fe..46d1907 100644 --- a/exercises/practice/protein-translation/.meta/spec_generator.moon +++ b/exercises/practice/protein-translation/.meta/spec_generator.moon @@ -1,5 +1,4 @@ -string_list = (list) -> - "{#{table.concat [quote word for word in *list], ', '}}" +import word_list from require 'test_helpers' { module_imports: {'proteins'}, @@ -14,7 +13,7 @@ string_list = (list) -> else lines = { "result = proteins #{quote case.input.strand}", - "expected = #{string_list case.expected}", + "expected = #{word_list case.expected}", "assert.are.same expected, result" } table.concat [indent line, level for line in *lines], '\n' diff --git a/exercises/practice/proverb/.meta/spec_generator.moon b/exercises/practice/proverb/.meta/spec_generator.moon index 8946ed7..12a41ab 100644 --- a/exercises/practice/proverb/.meta/spec_generator.moon +++ b/exercises/practice/proverb/.meta/spec_generator.moon @@ -1,18 +1,18 @@ +import word_list from require 'test_helpers' + { module_name: 'recite', generate_test: (case, level) -> - input = table.concat [quote word for word in *case.input.strings], ', ' - local expected - if is_empty case.expected - expected = "''" + expected = if is_empty case.expected + "''" else - expected = "[[\n#{table.concat case.expected, '\n'}\n]]" + "[[\n#{table.concat case.expected, '\n'}\n]]" lines = { - (indent "result = recite {#{input}}", level), - (indent 'expected = ', level) .. expected, - (indent 'assert.are.equal expected, result', level) + "result = recite #{word_list case.input.strings}" + "expected = #{expected}" + 'assert.are.equal expected, result' } - table.concat lines, '\n' + table.concat [indent line, level for line in *lines], '\n' } diff --git a/exercises/practice/pythagorean-triplet/.meta/spec_generator.moon b/exercises/practice/pythagorean-triplet/.meta/spec_generator.moon index ae4c0ee..aebd1d8 100644 --- a/exercises/practice/pythagorean-triplet/.meta/spec_generator.moon +++ b/exercises/practice/pythagorean-triplet/.meta/spec_generator.moon @@ -1,15 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" - -int_lists = (lists, level) -> - if #lists == 0 - '{}' - elseif #lists == 1 - "{#{int_list lists[1]}}" - else - rows = [indent int_list(row), level + 1 for row in *lists] - table.insert rows, 1, '{' - table.insert rows, indent '}', level - table.concat rows, '\n' +import int_lists from require 'test_helpers' { module_imports: {'triplets_with_sum'}, diff --git a/exercises/practice/pythagorean-triplet/pythagorean_triplet_spec.moon b/exercises/practice/pythagorean-triplet/pythagorean_triplet_spec.moon index 6dad5d3..3408a1e 100644 --- a/exercises/practice/pythagorean-triplet/pythagorean_triplet_spec.moon +++ b/exercises/practice/pythagorean-triplet/pythagorean_triplet_spec.moon @@ -24,32 +24,32 @@ describe 'pythagorean-triplet', -> pending 'returns all matching triplets', -> result = triplets_with_sum 90 expected = { - {9, 40, 41} - {15, 36, 39} + {9, 40, 41}, + {15, 36, 39}, } assert.are.same expected, result pending 'several matching triplets', -> result = triplets_with_sum 840 expected = { - {40, 399, 401} - {56, 390, 394} - {105, 360, 375} - {120, 350, 370} - {140, 336, 364} - {168, 315, 357} - {210, 280, 350} - {240, 252, 348} + {40, 399, 401}, + {56, 390, 394}, + {105, 360, 375}, + {120, 350, 370}, + {140, 336, 364}, + {168, 315, 357}, + {210, 280, 350}, + {240, 252, 348}, } assert.are.same expected, result pending 'triplets for large number', -> result = triplets_with_sum 30000 expected = { - {1200, 14375, 14425} - {1875, 14000, 14125} - {5000, 12000, 13000} - {6000, 11250, 12750} - {7500, 10000, 12500} + {1200, 14375, 14425}, + {1875, 14000, 14125}, + {5000, 12000, 13000}, + {6000, 11250, 12750}, + {7500, 10000, 12500}, } assert.are.same expected, result diff --git a/exercises/practice/rational-numbers/.meta/spec_generator.moon b/exercises/practice/rational-numbers/.meta/spec_generator.moon index 6dd1107..080c9e7 100644 --- a/exercises/practice/rational-numbers/.meta/spec_generator.moon +++ b/exercises/practice/rational-numbers/.meta/spec_generator.moon @@ -1,4 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" +import int_list from require 'test_helpers' { module_name: 'rational', diff --git a/exercises/practice/resistor-color-duo/.meta/spec_generator.moon b/exercises/practice/resistor-color-duo/.meta/spec_generator.moon index 04f4fc4..8b8b106 100644 --- a/exercises/practice/resistor-color-duo/.meta/spec_generator.moon +++ b/exercises/practice/resistor-color-duo/.meta/spec_generator.moon @@ -4,7 +4,7 @@ input = ["'#{color}'" for color in *case.input.colors] lines = { "result = ResistorColorDuo.value #{table.concat input, ', '}", - "assert.are.same #{case.expected}, result" + "assert.are.equal #{case.expected}, result" } table.concat [indent line, level for line in *lines], '\n' } diff --git a/exercises/practice/resistor-color-duo/resistor_color_duo_spec.moon b/exercises/practice/resistor-color-duo/resistor_color_duo_spec.moon index 4e0822e..1654de6 100644 --- a/exercises/practice/resistor-color-duo/resistor_color_duo_spec.moon +++ b/exercises/practice/resistor-color-duo/resistor_color_duo_spec.moon @@ -3,28 +3,28 @@ ResistorColorDuo = require 'resistor_color_duo' describe 'resistor-color-duo', -> it 'Brown and black', -> result = ResistorColorDuo.value 'brown', 'black' - assert.are.same 10, result + assert.are.equal 10, result pending 'Blue and grey', -> result = ResistorColorDuo.value 'blue', 'grey' - assert.are.same 68, result + assert.are.equal 68, result pending 'Yellow and violet', -> result = ResistorColorDuo.value 'yellow', 'violet' - assert.are.same 47, result + assert.are.equal 47, result pending 'White and red', -> result = ResistorColorDuo.value 'white', 'red' - assert.are.same 92, result + assert.are.equal 92, result pending 'Orange and orange', -> result = ResistorColorDuo.value 'orange', 'orange' - assert.are.same 33, result + assert.are.equal 33, result pending 'Ignore additional colors', -> result = ResistorColorDuo.value 'green', 'brown', 'orange' - assert.are.same 51, result + assert.are.equal 51, result pending 'Black and brown, one-digit', -> result = ResistorColorDuo.value 'black', 'brown' - assert.are.same 1, result + assert.are.equal 1, result diff --git a/exercises/practice/rest-api/.meta/spec_generator.moon b/exercises/practice/rest-api/.meta/spec_generator.moon index 4ac3829..048ef0b 100644 --- a/exercises/practice/rest-api/.meta/spec_generator.moon +++ b/exercises/practice/rest-api/.meta/spec_generator.moon @@ -1,5 +1,4 @@ -test_helpers = require 'test_helpers' -import table_dump from test_helpers +import table_dump from require 'test_helpers' { module_name: 'RestApi', diff --git a/exercises/practice/reverse-string/.meta/spec_generator.moon b/exercises/practice/reverse-string/.meta/spec_generator.moon index d4bf137..34df15e 100644 --- a/exercises/practice/reverse-string/.meta/spec_generator.moon +++ b/exercises/practice/reverse-string/.meta/spec_generator.moon @@ -2,8 +2,8 @@ module_name: 'reverse', generate_test: (case, level) -> lines = { - "result = reverse \"#{case.input.value}\"", - "assert.are.same \"#{case.expected}\", result", + "result = reverse #{quote case.input.value}", + "assert.are.equal #{quote case.expected}, result", } table.concat [indent line, level for line in *lines], "\n" } diff --git a/exercises/practice/reverse-string/reverse_string_spec.moon b/exercises/practice/reverse-string/reverse_string_spec.moon index d274cdb..eeab849 100644 --- a/exercises/practice/reverse-string/reverse_string_spec.moon +++ b/exercises/practice/reverse-string/reverse_string_spec.moon @@ -2,29 +2,29 @@ reverse = require 'reverse_string' describe 'reverse-string', -> it 'an empty string', -> - result = reverse "" - assert.are.same "", result + result = reverse '' + assert.are.equal '', result pending 'a word', -> - result = reverse "robot" - assert.are.same "tobor", result + result = reverse 'robot' + assert.are.equal 'tobor', result pending 'a capitalized word', -> - result = reverse "Ramen" - assert.are.same "nemaR", result + result = reverse 'Ramen' + assert.are.equal 'nemaR', result pending 'a sentence with punctuation', -> result = reverse "I'm hungry!" - assert.are.same "!yrgnuh m'I", result + assert.are.equal "!yrgnuh m'I", result pending 'a palindrome', -> - result = reverse "racecar" - assert.are.same "racecar", result + result = reverse 'racecar' + assert.are.equal 'racecar', result pending 'an even-sized word', -> - result = reverse "drawer" - assert.are.same "reward", result + result = reverse 'drawer' + assert.are.equal 'reward', result pending 'wide characters', -> - result = reverse "子猫" - assert.are.same "猫子", result + result = reverse '子猫' + assert.are.equal '猫子', result diff --git a/exercises/practice/saddle-points/.meta/spec_generator.moon b/exercises/practice/saddle-points/.meta/spec_generator.moon index 2fe7267..330f7b9 100644 --- a/exercises/practice/saddle-points/.meta/spec_generator.moon +++ b/exercises/practice/saddle-points/.meta/spec_generator.moon @@ -1,13 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" - -int_lists = (lists, level) -> - if #lists == 1 - "{#{int_list lists[1]}}" - else - rows = [indent int_list(row) .. ',', level + 1 for row in *lists] - table.insert rows, 1, '{' - table.insert rows, indent '}', level - table.concat rows, '\n' +import int_lists, table_tostring_ordered from require 'test_helpers' result_obj = (obj) -> "{row: #{obj.row}, column: #{obj.column}}" result_list = (list) -> "{#{table.concat [result_obj obj for obj in *list], ', '}}" diff --git a/exercises/practice/secret-handshake/.meta/spec_generator.moon b/exercises/practice/secret-handshake/.meta/spec_generator.moon index d33e9a0..532ce86 100644 --- a/exercises/practice/secret-handshake/.meta/spec_generator.moon +++ b/exercises/practice/secret-handshake/.meta/spec_generator.moon @@ -1,5 +1,4 @@ -list_of_strings = (list) -> - "{#{table.concat [quote word for word in *list], ', '}}" +import word_list from require 'test_helpers' { module_name: 'SecretHandshake', @@ -9,7 +8,7 @@ list_of_strings = (list) -> -- you may want to "switch case.property" here lines = { "result = SecretHandshake.#{case.property} #{case.input.number}", - "expected = #{list_of_strings case.expected}", + "expected = #{word_list case.expected}", "assert.are.same expected, result" } table.concat [indent line, level for line in *lines], '\n' diff --git a/exercises/practice/series/.meta/spec_generator.moon b/exercises/practice/series/.meta/spec_generator.moon index 9d5c41f..1b9f70e 100644 --- a/exercises/practice/series/.meta/spec_generator.moon +++ b/exercises/practice/series/.meta/spec_generator.moon @@ -1,5 +1,4 @@ -list_of_words = (list) -> - "{#{table.concat [quote word for word in *list], ', '}}" +import word_list from require 'test_helpers' { module_imports: {'slices'}, @@ -15,8 +14,8 @@ list_of_words = (list) -> } else lines = { - "result = [s for s in #{cmd}]" - "expected = #{list_of_words case.expected}" + "result = [slice for slice in #{cmd}]" + "expected = #{word_list case.expected}" "assert.are.same expected, result" } table.concat [indent line, level for line in *lines], '\n' diff --git a/exercises/practice/series/series_spec.moon b/exercises/practice/series/series_spec.moon index 8d72e7c..4669571 100644 --- a/exercises/practice/series/series_spec.moon +++ b/exercises/practice/series/series_spec.moon @@ -2,32 +2,32 @@ import slices from require 'series' describe 'series', -> it 'slices of one from one', -> - result = [s for s in slices '1', 1] + result = [slice for slice in slices '1', 1] expected = {'1'} assert.are.same expected, result pending 'slices of one from two', -> - result = [s for s in slices '12', 1] + result = [slice for slice in slices '12', 1] expected = {'1', '2'} assert.are.same expected, result pending 'slices of two', -> - result = [s for s in slices '35', 2] + result = [slice for slice in slices '35', 2] expected = {'35'} assert.are.same expected, result pending 'slices of two overlap', -> - result = [s for s in slices '9142', 2] + result = [slice for slice in slices '9142', 2] expected = {'91', '14', '42'} assert.are.same expected, result pending 'slices can include duplicates', -> - result = [s for s in slices '777777', 3] + result = [slice for slice in slices '777777', 3] expected = {'777', '777', '777', '777'} assert.are.same expected, result pending 'slices of a long series', -> - result = [s for s in slices '918493904243', 5] + result = [slice for slice in slices '918493904243', 5] expected = {'91849', '18493', '84939', '49390', '93904', '39042', '90424', '04243'} assert.are.same expected, result diff --git a/exercises/practice/sieve/.meta/spec_generator.moon b/exercises/practice/sieve/.meta/spec_generator.moon index 76743cd..606c001 100644 --- a/exercises/practice/sieve/.meta/spec_generator.moon +++ b/exercises/practice/sieve/.meta/spec_generator.moon @@ -1,21 +1,4 @@ -formatted = (list, level) -> - joined = table.concat list, ', ' - cmd = "echo '#{joined}' | fold -s -w 76" - fh = io.popen cmd, 'r' - return "{#{joined}}" if not fh - - lines = [indent(line\gsub('%s+$', ''), level + 1) for line in fh\lines!] - - result = {fh\close!} - lines = {joined} if not result[1] - - if #lines == 1 - "{#{lines[1]\gsub('^%s+', '')}}" - else - table.insert lines, 1, "{" - table.insert lines, (indent "}", level) - table.concat lines, '\n' - +import int_list_wrapped from require 'test_helpers' { module_name: 'Sieve', @@ -23,7 +6,7 @@ formatted = (list, level) -> generate_test: (case, level) -> lines = { "result = Sieve.#{case.property} #{case.input.limit}", - "expected = #{formatted case.expected, level}", + "expected = #{int_list_wrapped case.expected, level}", "assert.are.same expected, result" } table.concat [indent line, level for line in *lines], '\n' diff --git a/exercises/practice/simple-linked-list/.meta/spec_generator.moon b/exercises/practice/simple-linked-list/.meta/spec_generator.moon index dc051d7..5179d7b 100644 --- a/exercises/practice/simple-linked-list/.meta/spec_generator.moon +++ b/exercises/practice/simple-linked-list/.meta/spec_generator.moon @@ -1,4 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" +import int_list from require 'test_helpers' { module_name: 'SimpleLinkedList', diff --git a/exercises/practice/space-age/.meta/spec_generator.moon b/exercises/practice/space-age/.meta/spec_generator.moon index 997877e..9107bab 100644 --- a/exercises/practice/space-age/.meta/spec_generator.moon +++ b/exercises/practice/space-age/.meta/spec_generator.moon @@ -1,4 +1,3 @@ - { module_name: 'SpaceAge', diff --git a/exercises/practice/spiral-matrix/.meta/spec_generator.moon b/exercises/practice/spiral-matrix/.meta/spec_generator.moon index 4f94165..b40a67c 100644 --- a/exercises/practice/spiral-matrix/.meta/spec_generator.moon +++ b/exercises/practice/spiral-matrix/.meta/spec_generator.moon @@ -1,14 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" - -int_lists = (list, level) -> - switch #list - when 0 then '{}' - when 1 then '{{1}}' - else - rows = [indent int_list(row), level + 1 for row in *list] - table.insert rows, 1, '{' - table.insert rows, indent('}', level) - table.concat rows, '\n' +import int_lists from require 'test_helpers' { module_imports: {'spiral_matrix'}, diff --git a/exercises/practice/spiral-matrix/spiral_matrix_spec.moon b/exercises/practice/spiral-matrix/spiral_matrix_spec.moon index 8e5a96c..072bdcd 100644 --- a/exercises/practice/spiral-matrix/spiral_matrix_spec.moon +++ b/exercises/practice/spiral-matrix/spiral_matrix_spec.moon @@ -14,37 +14,37 @@ describe 'spiral-matrix', -> pending 'spiral of size 2', -> result = spiral_matrix 2 expected = { - {1, 2} - {4, 3} + {1, 2}, + {4, 3}, } assert.are.same expected, result pending 'spiral of size 3', -> result = spiral_matrix 3 expected = { - {1, 2, 3} - {8, 9, 4} - {7, 6, 5} + {1, 2, 3}, + {8, 9, 4}, + {7, 6, 5}, } assert.are.same expected, result pending 'spiral of size 4', -> result = spiral_matrix 4 expected = { - {1, 2, 3, 4} - {12, 13, 14, 5} - {11, 16, 15, 6} - {10, 9, 8, 7} + {1, 2, 3, 4}, + {12, 13, 14, 5}, + {11, 16, 15, 6}, + {10, 9, 8, 7}, } assert.are.same expected, result pending 'spiral of size 5', -> result = spiral_matrix 5 expected = { - {1, 2, 3, 4, 5} - {16, 17, 18, 19, 6} - {15, 24, 25, 20, 7} - {14, 23, 22, 21, 8} - {13, 12, 11, 10, 9} + {1, 2, 3, 4, 5}, + {16, 17, 18, 19, 6}, + {15, 24, 25, 20, 7}, + {14, 23, 22, 21, 8}, + {13, 12, 11, 10, 9}, } assert.are.same expected, result diff --git a/exercises/practice/split-second-stopwatch/.meta/spec_generator.moon b/exercises/practice/split-second-stopwatch/.meta/spec_generator.moon index 550260a..dcf7187 100644 --- a/exercises/practice/split-second-stopwatch/.meta/spec_generator.moon +++ b/exercises/practice/split-second-stopwatch/.meta/spec_generator.moon @@ -1,13 +1,8 @@ -format_expected = (val) -> - if type(val) != 'table' - quote val -- for state string - elseif #val == 0 - "{}" -- for empty previous laps - else - "{ #{table.concat [quote v for v in *val], ', '} }" -- for non-empty previous laps +import word_list from require 'test_helpers' -camel_case = (str) -> - str\gsub "_(%l)", (l) -> l\upper! +format_expected = (val) -> type(val) == 'table' and word_list(val) or quote(val) + +camel_case = (str) -> str\gsub "_(%l)", string.upper { module_name: 'SplitSecondStopwatch' diff --git a/exercises/practice/split-second-stopwatch/split_second_stopwatch_spec.moon b/exercises/practice/split-second-stopwatch/split_second_stopwatch_spec.moon index bca3dea..af2b53a 100644 --- a/exercises/practice/split-second-stopwatch/split_second_stopwatch_spec.moon +++ b/exercises/practice/split-second-stopwatch/split_second_stopwatch_spec.moon @@ -108,10 +108,10 @@ describe 'split-second-stopwatch', -> stopwatch\start! stopwatch\advanceTime '00:01:38' stopwatch\lap! - assert.same { '00:01:38' }, stopwatch\previousLaps! + assert.same {'00:01:38'}, stopwatch\previousLaps! stopwatch\advanceTime '00:00:44' stopwatch\lap! - assert.same { '00:01:38', '00:00:44' }, stopwatch\previousLaps! + assert.same {'00:01:38', '00:00:44'}, stopwatch\previousLaps! pending 'lap resets current lap and resumes time tracking', -> stopwatch = SplitSecondStopwatch.Stopwatch! @@ -145,9 +145,9 @@ describe 'split-second-stopwatch', -> stopwatch\start! stopwatch\advanceTime '00:11:22' stopwatch\lap! - assert.same { '00:11:22' }, stopwatch\previousLaps! + assert.same {'00:11:22'}, stopwatch\previousLaps! stopwatch\stop! - assert.same { '00:11:22' }, stopwatch\previousLaps! + assert.same {'00:11:22'}, stopwatch\previousLaps! pending 'reset from stopped state changes state to ready', -> stopwatch = SplitSecondStopwatch.Stopwatch! @@ -171,7 +171,7 @@ describe 'split-second-stopwatch', -> stopwatch\lap! stopwatch\advanceTime '00:00:20' stopwatch\lap! - assert.same { '00:00:10', '00:00:20' }, stopwatch\previousLaps! + assert.same {'00:00:10', '00:00:20'}, stopwatch\previousLaps! stopwatch\stop! stopwatch\reset! assert.same {}, stopwatch\previousLaps! @@ -191,14 +191,14 @@ describe 'split-second-stopwatch', -> stopwatch\advanceTime '01:23:45' assert.same '01:23:45', stopwatch\currentLap! stopwatch\lap! - assert.same { '01:23:45' }, stopwatch\previousLaps! + assert.same {'01:23:45'}, stopwatch\previousLaps! stopwatch\advanceTime '04:01:40' assert.same '04:01:40', stopwatch\currentLap! assert.same '05:25:25', stopwatch\total! stopwatch\lap! - assert.same { '01:23:45', '04:01:40' }, stopwatch\previousLaps! + assert.same {'01:23:45', '04:01:40'}, stopwatch\previousLaps! stopwatch\advanceTime '08:43:05' assert.same '08:43:05', stopwatch\currentLap! assert.same '14:08:30', stopwatch\total! stopwatch\lap! - assert.same { '01:23:45', '04:01:40', '08:43:05' }, stopwatch\previousLaps! + assert.same {'01:23:45', '04:01:40', '08:43:05'}, stopwatch\previousLaps! diff --git a/exercises/practice/state-of-tic-tac-toe/.meta/spec_generator.moon b/exercises/practice/state-of-tic-tac-toe/.meta/spec_generator.moon index e677b51..033c5fa 100644 --- a/exercises/practice/state-of-tic-tac-toe/.meta/spec_generator.moon +++ b/exercises/practice/state-of-tic-tac-toe/.meta/spec_generator.moon @@ -1,12 +1,4 @@ -string_list = (list, level) -> - if #list <= 2 - "{#{table.concat [quote elem for elem in *list], ', '}}" - else - lines = [indent quote(elem) .. ',', level + 1 for elem in *list] - table.insert lines, 1, '{' - table.insert lines, indent('}', level) - table.concat lines, '\n' - +import string_list from require 'test_helpers' { module_imports: {'gamestate'}, diff --git a/exercises/practice/strain/.meta/spec_generator.moon b/exercises/practice/strain/.meta/spec_generator.moon index 3d1dece..d9bd89b 100644 --- a/exercises/practice/strain/.meta/spec_generator.moon +++ b/exercises/practice/strain/.meta/spec_generator.moon @@ -1,3 +1,5 @@ +import int_list, word_list from require 'test_helpers' + format_predicate = (pred) -> switch pred when "fn(x) -> true" @@ -19,14 +21,14 @@ format_list = (list) -> if #list == 0 "{}" elseif type(list[1]) == 'string' - "{" .. table.concat([quote(elem) for elem in *list], ', ') .. "}" + word_list list else - "{" .. table.concat(list, ', ') .. "}" + int_list list format_value = (val, level) -> if #val == 0 '{}' - elseif type(val[1]) == 'table' + elseif type(val[1]) == 'table' -- list of lists rows = [indent format_list(row), level + 1 for row in *val] table.insert rows, 1, '{' table.insert rows, indent('}', level) @@ -50,11 +52,9 @@ format_value = (val, level) -> ]] generate_test: (case, level) -> - - lines = { - "result = Strain.#{case.property} #{format_value(case.input.list, level)}, #{format_predicate case.input.predicate}" - "expected = #{format_value(case.expected, level)}" + "result = Strain.#{case.property} #{format_value case.input.list, level }, #{format_predicate case.input.predicate}" + "expected = #{format_value case.expected, level }" "assert.are.same expected, result" } diff --git a/exercises/practice/sum-of-multiples/.meta/spec_generator.moon b/exercises/practice/sum-of-multiples/.meta/spec_generator.moon index 1d9b1ef..0383f4c 100644 --- a/exercises/practice/sum-of-multiples/.meta/spec_generator.moon +++ b/exercises/practice/sum-of-multiples/.meta/spec_generator.moon @@ -1,4 +1,4 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" +import int_list from require 'test_helpers' { module_name: 'SumOfMultiples', diff --git a/exercises/practice/transpose/.meta/spec_generator.moon b/exercises/practice/transpose/.meta/spec_generator.moon index 658b63d..8dbbf8e 100644 --- a/exercises/practice/transpose/.meta/spec_generator.moon +++ b/exercises/practice/transpose/.meta/spec_generator.moon @@ -1,11 +1,4 @@ -string_list = (list, level) -> - if #list <= 2 - "{#{table.concat [quote elem for elem in *list], ', '}}" - else - instrs = [indent quote(elem) .. ',', level + 1 for elem in *list] - table.insert instrs, 1, '{' - table.insert instrs, indent('}', level) - table.concat instrs, '\n' +import string_list from require 'test_helpers' { module_imports: {'transpose'}, diff --git a/exercises/practice/twelve-days/.meta/spec_generator.moon b/exercises/practice/twelve-days/.meta/spec_generator.moon index dc3b98f..24362e1 100644 --- a/exercises/practice/twelve-days/.meta/spec_generator.moon +++ b/exercises/practice/twelve-days/.meta/spec_generator.moon @@ -1,12 +1,4 @@ -str_list = (list, level) -> - if #list <= 1 - "{#{table.concat [quote elem for elem in *list], ', '}}" - else - item = [indent quote(elem) .. ',', level + 1 for elem in *list] - table.insert item, 1, '{' - table.insert item, indent('}', level) - table.concat item, '\n' - +import string_list from require 'test_helpers' { module_name: 'TwelveDays', @@ -14,7 +6,7 @@ str_list = (list, level) -> generate_test: (case, level) -> lines = { "result = TwelveDays.#{case.property} #{case.input.startVerse}, #{case.input.endVerse}", - "expected = #{str_list case.expected, level}", + "expected = #{string_list case.expected, level}", "assert.are.same expected, result" } table.concat [indent line, level for line in *lines], '\n' diff --git a/exercises/practice/two-bucket/.meta/spec_generator.moon b/exercises/practice/two-bucket/.meta/spec_generator.moon index ae1e55d..8b9746d 100644 --- a/exercises/practice/two-bucket/.meta/spec_generator.moon +++ b/exercises/practice/two-bucket/.meta/spec_generator.moon @@ -1,16 +1,14 @@ +import table_tostring_ordered from require 'test_helpers' + { module_imports: {'measure'}, generate_test: (case, level) -> - local lines cmd = "measure bucketOne: #{case.input.bucketOne}, bucketTwo: #{case.input.bucketTwo}, goal: #{case.input.goal}, startBucket: '#{case.input.startBucket}'" - - if case.expected.error - lines = { - "assert.has.errors -> #{cmd}" - } + lines = if case.expected.error + { "assert.has.errors -> #{cmd}" } else - lines = { + { "result = #{cmd}", "expected = moves: #{case.expected.moves}, goalBucket: '#{case.expected.goalBucket}', otherBucket: #{case.expected.otherBucket}", "assert.are.same expected, result" diff --git a/exercises/practice/variable-length-quantity/.meta/spec_generator.moon b/exercises/practice/variable-length-quantity/.meta/spec_generator.moon index 38940b0..03fb8b5 100644 --- a/exercises/practice/variable-length-quantity/.meta/spec_generator.moon +++ b/exercises/practice/variable-length-quantity/.meta/spec_generator.moon @@ -1,17 +1,16 @@ -int_list = (list) -> "{#{table.concat list, ', '}}" +import int_list from require 'test_helpers' { module_name: 'VariableLengthQuantity', generate_test: (case, level) -> - local lines - if case.expected.error - lines = { + lines = if case.expected.error + { "f = -> VariableLengthQuantity.#{case.property} #{int_list case.input.integers}" "assert.has.errors f, #{quote case.expected.error}" } else - lines = { + { "result = VariableLengthQuantity.#{case.property} #{int_list case.input.integers}", "expected = #{int_list case.expected}" "assert.are.same expected, result" diff --git a/exercises/practice/word-count/.meta/spec_generator.moon b/exercises/practice/word-count/.meta/spec_generator.moon index 4caaab6..6c7a254 100644 --- a/exercises/practice/word-count/.meta/spec_generator.moon +++ b/exercises/practice/word-count/.meta/spec_generator.moon @@ -1,15 +1,4 @@ -json = require 'dkjson' - -kv_table = (tbl, level) -> - lines = {'{'} - keys = [k for k, _ in pairs tbl] - table.sort keys - for k in *keys - key = if k\match('^%a%w*$') then k else "#{quote k}" - table.insert lines, indent "#{key}: #{tbl[k]},", level + 1 - table.insert lines, indent '}', level - table.concat lines, '\n' - +import json_string, kv_table from require 'test_helpers' { module_imports: {'count_words'}, @@ -33,7 +22,7 @@ kv_table = (tbl, level) -> generate_test: (case, level) -> lines = { - "result = count_words #{json.encode case.input.sentence}", + "result = count_words #{json_string case.input.sentence}", "expected = #{kv_table case.expected, level}", "assert.has.same_kv result, expected" } diff --git a/exercises/practice/word-count/word_count_spec.moon b/exercises/practice/word-count/word_count_spec.moon index fd0d5ee..4334d23 100644 --- a/exercises/practice/word-count/word_count_spec.moon +++ b/exercises/practice/word-count/word_count_spec.moon @@ -35,10 +35,10 @@ describe 'word-count', -> pending 'multiple occurrences of a word', -> result = count_words "one fish two fish red fish blue fish" expected = { - blue: 1, fish: 4, one: 1, red: 1, + blue: 1, two: 1, } assert.has.same_kv result, expected @@ -46,29 +46,29 @@ describe 'word-count', -> pending 'handles cramped lists', -> result = count_words "one,two,three" expected = { - one: 1, - three: 1, two: 1, + three: 1, + one: 1, } assert.has.same_kv result, expected pending 'handles expanded lists', -> result = count_words "one,\ntwo,\nthree" expected = { - one: 1, - three: 1, two: 1, + three: 1, + one: 1, } assert.has.same_kv result, expected pending 'ignore punctuation', -> result = count_words "car: carpet as java: javascript!!&@$%^&" expected = { - as: 1, - car: 1, carpet: 1, - java: 1, javascript: 1, + as: 1, + java: 1, + car: 1, } assert.has.same_kv result, expected @@ -76,8 +76,8 @@ describe 'word-count', -> result = count_words "testing, 1, 2 testing" expected = { '1': 1, - '2': 1, testing: 2, + '2': 1, } assert.has.same_kv result, expected @@ -92,64 +92,64 @@ describe 'word-count', -> pending 'with apostrophes', -> result = count_words "'First: don't laugh. Then: don't cry. You're getting it.'" expected = { - cry: 1, - "don't": 2, first: 1, - getting: 1, it: 1, laugh: 1, - then: 1, "you're": 1, + cry: 1, + then: 1, + getting: 1, + "don't": 2, } assert.has.same_kv result, expected pending 'with quotations', -> result = count_words "Joe can't tell between 'large' and large." expected = { + tell: 1, and: 1, - between: 1, + large: 2, "can't": 1, + between: 1, joe: 1, - large: 2, - tell: 1, } assert.has.same_kv result, expected pending 'substrings from the beginning', -> result = count_words "Joe can't tell between app, apple and a." expected = { - a: 1, - and: 1, app: 1, + a: 1, + tell: 1, apple: 1, - between: 1, + and: 1, "can't": 1, + between: 1, joe: 1, - tell: 1, } assert.has.same_kv result, expected pending 'multiple spaces not detected as a word', -> result = count_words " multiple whitespaces" expected = { - multiple: 1, whitespaces: 1, + multiple: 1, } assert.has.same_kv result, expected pending 'alternating word separators not detected as a word', -> result = count_words ",\n,one,\n ,two \n 'three'" expected = { - one: 1, - three: 1, two: 1, + three: 1, + one: 1, } assert.has.same_kv result, expected pending 'quotation for word with apostrophe', -> result = count_words "can, can't, 'can't'" expected = { - can: 1, "can't": 2, + can: 1, } assert.has.same_kv result, expected diff --git a/exercises/practice/zebra-puzzle/.meta/spec_generator.moon b/exercises/practice/zebra-puzzle/.meta/spec_generator.moon index 1d25f5b..19278c5 100644 --- a/exercises/practice/zebra-puzzle/.meta/spec_generator.moon +++ b/exercises/practice/zebra-puzzle/.meta/spec_generator.moon @@ -2,8 +2,5 @@ module_imports: {'drinksWater', 'ownsZebra'}, generate_test: (case, level) -> - lines = { - "assert.are.equal #{quote case.expected}, #{case.property}!" - } - table.concat [indent line, level for line in *lines], '\n' + indent "assert.are.equal #{quote case.expected}, #{case.property}!", level } diff --git a/lib/test_helpers.moon b/lib/test_helpers.moon index 6222578..7d883d0 100644 --- a/lib/test_helpers.moon +++ b/lib/test_helpers.moon @@ -1,12 +1,21 @@ json = require 'dkjson' +-- example usage in a spec_generator: +-- import int_list, word_list from require 'test_helpers' + --- ----------------------------------------------------------------------- +--- Lists of booleans +bool_list = (list) -> "{#{table.concat [tostring b for b in *list], ', '}}" + --- List of ints int_list = (list) -> "{#{table.concat list, ', '}}" --- List of lists of ints int_lists = (lists, level) -> - if #lists == 1 + error 'Provide a level for `int_lists`', 2 if not level + if #lists == 0 + '{}' + elseif #lists == 1 "{#{int_list lists[1]}}" else rows = [indent int_list(row) .. ',', level + 1 for row in *lists] @@ -64,17 +73,27 @@ kv_table = (tbl, level) -> error 'Provide a level for `kv_table`', 2 if not level lines = {'{'} for k, v in pairs tbl - key = if k\match('^%a%w*$') then k else "[#{quote k}]" + key = if math.type(k) == "integer" + "[#{k}]" + elseif k\match('^%a%w*$') + k + else + quote k table.insert lines, indent "#{key}: #{v},", level + 1 table.insert lines, indent '}', level table.concat lines, '\n' --- key-value table as a one-line string --- Reminder: order of keys in indeterminate +-- Reminder: order of keys in indeterminate. +-- Note that `%q` renders floats in a hex format: -6.429 => -0x1.9b74bc6a7ef9ep+2 table_tostring = (t) -> s = [string.format '%s: %q', k, v for k, v in pairs t] "{#{table.concat s, ', '}}" +table_tostring_ordered = (t, keys) -> + s = [string.format '%s: %q', k, t[k] for k in *keys] + "{#{table.concat s, ', '}}" + --- Table contains an element table_contains = (list, target) -> for elem in *list @@ -125,6 +144,7 @@ table_dump = (what, level = 0) -> --- ----------------------------------------------------------------------- { + :bool_list :int_list :int_lists :int_list_wrapped @@ -132,6 +152,7 @@ table_dump = (what, level = 0) -> :string_list :kv_table :table_tostring + :table_tostring_ordered :json_string :table_contains :table_dump