diff --git a/exercises/practice/dnd-character/.meta/template.create_test_table.j2 b/exercises/practice/dnd-character/.meta/template.create_test_table.j2 new file mode 100644 index 00000000..7977e79b --- /dev/null +++ b/exercises/practice/dnd-character/.meta/template.create_test_table.j2 @@ -0,0 +1,74 @@ +DROP TABLE IF EXISTS tests; + +CREATE TABLE IF NOT EXISTS tests ( + -- uuid and description are taken from the test.toml file + uuid TEXT PRIMARY KEY, + description TEXT NOT NULL, + -- The following section is needed by the online test-runner + status TEXT DEFAULT 'fail', + message TEXT, + output TEXT, + test_code TEXT, + task_id INTEGER DEFAULT NULL, + -- Here are columns for the actual tests + property TEXT NOT NULL, + input TEXT NOT NULL, + constitution INTEGER, + modifier INTEGER, + expected TEXT NOT NULL +); + +INSERT INTO + tests ( + uuid, + description, + property, + input, + constitution, + modifier, + expected + ) +VALUES +{%- for case in cases -%}{%- if case["property"] == "modifier" %} + ( + '{{ case["uuid"] }}', + '{{ case["description"] }}', + '{{ case["property"] }}', + 'score', + {{ case["input"]["score"] }}, + {{ case["expected"] }}, + '' +{%- if loop.last %} + ); +{%- else %} + ), +{%- endif %} +{%- endif %} +{%- endfor %} + ( + '4f28f19c-2e47-4453-a46a-c0d365259c14', + 'random ability is within range', + 'ability', + 'random', + NULL, + NULL, + 'score >= 3 && score <= 18' + ), + ( + '385d7e72-864f-4e88-8279-81a7d75b04ad', + 'random character is valid', + 'character', + 'random', + NULL, + NULL, + '{"strength":"strength >= 3 && strength <= 18","dexterity":"dexterity >= 3 && dexterity <= 18","constitution":"constitution >= 3 && constitution <= 18","intelligence":"intelligence >= 3 && intelligence <= 18","wisdom":"wisdom >= 3 && wisdom <= 18","charisma":"charisma >= 3 && charisma <= 18","hitpoints":"hitpoints == 10 + modifier(constitution)"}' + ), + ( + 'dca2b2ec-f729-4551-84b9-078876bb4808', + 'each ability is only calculated once', + 'character', + '', + NULL, + NULL, + '{"strength":"strength == strength","dexterity":"dexterity == dexterity","constitution":"constitution == constitution","intelligence":"intelligence == intelligence","wisdom":"wisdom == wisdom","charisma":"charisma == charisma"}' + ); diff --git a/exercises/practice/dnd-character/.meta/template.data.j2 b/exercises/practice/dnd-character/.meta/template.data.j2 new file mode 100644 index 00000000..eb448858 --- /dev/null +++ b/exercises/practice/dnd-character/.meta/template.data.j2 @@ -0,0 +1,7 @@ +{%- for case in cases -%}{%- if case["property"] == "modifier" %} +"{{ case["property"] }}","score",,,{{ case["input"]["score"] }},,,,, +{%- endif %} +{%- endfor %} +"ability","random",,,,,,,, +"character","random",,,,,,,, +"character","",,,,,,,, diff --git a/exercises/practice/queen-attack/.meta/template.create_test_table.j2 b/exercises/practice/queen-attack/.meta/template.create_test_table.j2 new file mode 100644 index 00000000..920090e3 --- /dev/null +++ b/exercises/practice/queen-attack/.meta/template.create_test_table.j2 @@ -0,0 +1,65 @@ +DROP TABLE IF EXISTS tests; + +CREATE TABLE IF NOT EXISTS tests ( + -- uuid and description are taken from the test.toml file + uuid TEXT PRIMARY KEY, + description TEXT NOT NULL, + -- The following section is needed by the online test-runner + status TEXT DEFAULT 'fail', + message TEXT, + output TEXT, + test_code TEXT, + task_id INTEGER DEFAULT NULL, + -- Here are columns for the actual tests + white_row INTEGER NOT NULL, + white_col INTEGER NOT NULL, + black_row INTEGER NOT NULL, + black_col INTEGER NOT NULL, + expected_result BOOLEAN, + expected_error TEXT +); + +INSERT INTO + tests ( + uuid, + description, + white_row, + white_col, + black_row, + black_col, + expected_result, + expected_error + ) +VALUES +{%- for case in cases %} + ( + '{{ case["uuid"] }}', + '{{ case["description"] }}',{%- if case["property"] == "create" %} + {{ case["input"]["queen"]["position"]["row"] }}, + {{ case["input"]["queen"]["position"]["column"] }}, + {{ case["input"]["queen"]["position"]["row"] }}, + {{ case["input"]["queen"]["position"]["column"] }}, +{%- elif case["property"] == "canAttack" %} + {{ case["input"]["white_queen"]["position"]["row"] }}, + {{ case["input"]["white_queen"]["position"]["column"] }}, + {{ case["input"]["black_queen"]["position"]["row"] }}, + {{ case["input"]["black_queen"]["position"]["column"] }}, +{%- endif %} +{%- if not case["expect_error"] %} + {%- if case["property"] == "create" %} + {#- For "create", we use the same position twice. #} + {#- If the position is valid, the queen can reach itself. #} + 1, + {%- else %} + {{ case["expected"] | int }}, + {%- endif %} +{%- else %} + NULL, +{%- endif %} + {{ case.get("expect_error_msg") | quote }} +{%- if loop.last %} + ); +{%- else %} + ), +{%- endif %} +{%- endfor %} diff --git a/exercises/practice/queen-attack/.meta/template.data.j2 b/exercises/practice/queen-attack/.meta/template.data.j2 new file mode 100644 index 00000000..8ff14dac --- /dev/null +++ b/exercises/practice/queen-attack/.meta/template.data.j2 @@ -0,0 +1,11 @@ +{%- for case in cases -%}{%- if case["property"] == "create" %} +{{ ([case["input"]["queen"]["position"]["row"], case["input"]["queen"]["position"]["column"]] * 2) | join(",") }},, +{%- elif case["property"] == "canAttack" %} +{{ [ + case["input"]["white_queen"]["position"]["row"], + case["input"]["white_queen"]["position"]["column"], + case["input"]["black_queen"]["position"]["row"], + case["input"]["black_queen"]["position"]["column"], + ] | join(",") }},, +{%- endif %} +{%- endfor %} diff --git a/exercises/practice/robot-simulator/.meta/template.create_test_table.j2 b/exercises/practice/robot-simulator/.meta/template.create_test_table.j2 new file mode 100644 index 00000000..058899d5 --- /dev/null +++ b/exercises/practice/robot-simulator/.meta/template.create_test_table.j2 @@ -0,0 +1,34 @@ +DROP TABLE IF EXISTS tests; + +CREATE TABLE IF NOT EXISTS tests ( + -- uuid and description are taken from the test.toml file + uuid TEXT PRIMARY KEY, + description TEXT NOT NULL, + -- The following section is needed by the online test-runner + status TEXT DEFAULT 'fail', + message TEXT, + output TEXT, + test_code TEXT, + task_id INTEGER DEFAULT NULL, + -- Here are columns for the actual tests + property TEXT NOT NULL, + input INTEGER NOT NULL, -- json object + expected TEXT NOT NULL -- json object +); + +INSERT INTO + tests (uuid, description, property, input, expected) +VALUES +{%- for case in cases %} + ( + '{{ case["uuid"] }}', + '{{ case["description"] }}', + '{{ case["property"] }}', + '{{ case["input"] | tojson }}', + '{{ case["expected"] | tojson }}' +{%- if loop.last %} + ); +{%- else %} + ), +{%- endif %} +{%- endfor %} diff --git a/exercises/practice/robot-simulator/.meta/template.data.j2 b/exercises/practice/robot-simulator/.meta/template.data.j2 new file mode 100644 index 00000000..4e2e6e95 --- /dev/null +++ b/exercises/practice/robot-simulator/.meta/template.data.j2 @@ -0,0 +1,3 @@ +{%- for case in cases -%} +{{ [case["property"], case["input"] | tojson] | tocsv }},"" +{% endfor %} diff --git a/exercises/practice/robot-simulator/data.csv b/exercises/practice/robot-simulator/data.csv index 8057690c..2df66602 100644 --- a/exercises/practice/robot-simulator/data.csv +++ b/exercises/practice/robot-simulator/data.csv @@ -1,18 +1,18 @@ -"create","{""position"":{""x"":0,""y"":0},""direction"":""north""}", -"create","{""position"":{""x"":-1,""y"":-1},""direction"":""south""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""north"",""instructions"":""R""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""east"",""instructions"":""R""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""south"",""instructions"":""R""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""west"",""instructions"":""R""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""north"",""instructions"":""L""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""west"",""instructions"":""L""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""south"",""instructions"":""L""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""east"",""instructions"":""L""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""north"",""instructions"":""A""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""south"",""instructions"":""A""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""east"",""instructions"":""A""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""west"",""instructions"":""A""}", -"move","{""position"":{""x"":7,""y"":3},""direction"":""north"",""instructions"":""RAALAL""}", -"move","{""position"":{""x"":0,""y"":0},""direction"":""north"",""instructions"":""LAAARALA""}", -"move","{""position"":{""x"":2,""y"":-7},""direction"":""east"",""instructions"":""RRAAAAALA""}", -"move","{""position"":{""x"":8,""y"":4},""direction"":""south"",""instructions"":""LAAARRRALLLL""}", +"create","{""position"":{""x"":0,""y"":0},""direction"":""north""}","" +"create","{""position"":{""x"":-1,""y"":-1},""direction"":""south""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""north"",""instructions"":""R""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""east"",""instructions"":""R""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""south"",""instructions"":""R""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""west"",""instructions"":""R""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""north"",""instructions"":""L""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""west"",""instructions"":""L""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""south"",""instructions"":""L""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""east"",""instructions"":""L""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""north"",""instructions"":""A""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""south"",""instructions"":""A""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""east"",""instructions"":""A""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""west"",""instructions"":""A""}","" +"move","{""position"":{""x"":7,""y"":3},""direction"":""north"",""instructions"":""RAALAL""}","" +"move","{""position"":{""x"":0,""y"":0},""direction"":""north"",""instructions"":""LAAARALA""}","" +"move","{""position"":{""x"":2,""y"":-7},""direction"":""east"",""instructions"":""RRAAAAALA""}","" +"move","{""position"":{""x"":8,""y"":4},""direction"":""south"",""instructions"":""LAAARRRALLLL""}",""