From 5e5db7bbb5b828031696639264c2bf5162a38e84 Mon Sep 17 00:00:00 2001 From: Isaac Good Date: Sun, 16 Aug 2026 10:31:47 -0700 Subject: [PATCH] Add test generators for `clock collatz-conjecture crypto-square` --- .../clock/.meta/template.create_test_table.j2 | 38 +++++++ .../practice/clock/.meta/template.data.j2 | 3 + exercises/practice/clock/data.csv | 104 +++++++++--------- .../collatz-conjecture/.meta/template.data.j2 | 3 + .../.meta/template.create_test_table.j2 | 32 ++++++ .../crypto-square/.meta/template.data.j2 | 3 + exercises/practice/crypto-square/data.csv | 16 +-- 7 files changed, 139 insertions(+), 60 deletions(-) create mode 100644 exercises/practice/clock/.meta/template.create_test_table.j2 create mode 100644 exercises/practice/clock/.meta/template.data.j2 create mode 100644 exercises/practice/collatz-conjecture/.meta/template.data.j2 create mode 100644 exercises/practice/crypto-square/.meta/template.create_test_table.j2 create mode 100644 exercises/practice/crypto-square/.meta/template.data.j2 diff --git a/exercises/practice/clock/.meta/template.create_test_table.j2 b/exercises/practice/clock/.meta/template.create_test_table.j2 new file mode 100644 index 00000000..3f316ffd --- /dev/null +++ b/exercises/practice/clock/.meta/template.create_test_table.j2 @@ -0,0 +1,38 @@ +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, -- json object + expected TEXT NOT NULL +); + +INSERT INTO + tests (uuid, description, property, input, expected) +VALUES +{%- for case in cases %} + ( + '{{ case["uuid"] }}', + '{{ case["description"] }}', + '{{ case["property"] }}', + '{{ case["input"] | tojson }}', +{%- if case["expected"] in ["true", "false"] %} + {{ case["expected"] }} +{%- else %} + '{{ case["expected"] }}' +{%- endif %} +{%- if loop.last %} + ); +{%- else %} + ), +{%- endif %} +{%- endfor %} diff --git a/exercises/practice/clock/.meta/template.data.j2 b/exercises/practice/clock/.meta/template.data.j2 new file mode 100644 index 00000000..4e2e6e95 --- /dev/null +++ b/exercises/practice/clock/.meta/template.data.j2 @@ -0,0 +1,3 @@ +{%- for case in cases -%} +{{ [case["property"], case["input"] | tojson] | tocsv }},"" +{% endfor %} diff --git a/exercises/practice/clock/data.csv b/exercises/practice/clock/data.csv index 6dbbc52b..a8f11460 100644 --- a/exercises/practice/clock/data.csv +++ b/exercises/practice/clock/data.csv @@ -1,52 +1,52 @@ -"create","{""hour"":8,""minute"":0}", -"create","{""hour"":11,""minute"":9}", -"create","{""hour"":24,""minute"":0}", -"create","{""hour"":25,""minute"":0}", -"create","{""hour"":100,""minute"":0}", -"create","{""hour"":1,""minute"":60}", -"create","{""hour"":0,""minute"":160}", -"create","{""hour"":0,""minute"":1723}", -"create","{""hour"":25,""minute"":160}", -"create","{""hour"":201,""minute"":3001}", -"create","{""hour"":72,""minute"":8640}", -"create","{""hour"":-1,""minute"":15}", -"create","{""hour"":-25,""minute"":0}", -"create","{""hour"":-91,""minute"":0}", -"create","{""hour"":1,""minute"":-40}", -"create","{""hour"":1,""minute"":-160}", -"create","{""hour"":1,""minute"":-4820}", -"create","{""hour"":2,""minute"":-60}", -"create","{""hour"":-25,""minute"":-160}", -"create","{""hour"":-121,""minute"":-5810}", -"add","{""hour"":10,""minute"":0,""value"":3}", -"add","{""hour"":6,""minute"":41,""value"":0}", -"add","{""hour"":0,""minute"":45,""value"":40}", -"add","{""hour"":10,""minute"":0,""value"":61}", -"add","{""hour"":0,""minute"":45,""value"":160}", -"add","{""hour"":23,""minute"":59,""value"":2}", -"add","{""hour"":5,""minute"":32,""value"":1500}", -"add","{""hour"":1,""minute"":1,""value"":3500}", -"subtract","{""hour"":10,""minute"":3,""value"":3}", -"subtract","{""hour"":10,""minute"":3,""value"":30}", -"subtract","{""hour"":10,""minute"":3,""value"":70}", -"subtract","{""hour"":0,""minute"":3,""value"":4}", -"subtract","{""hour"":0,""minute"":0,""value"":160}", -"subtract","{""hour"":6,""minute"":15,""value"":160}", -"subtract","{""hour"":5,""minute"":32,""value"":1500}", -"subtract","{""hour"":2,""minute"":20,""value"":3000}", -"equal","{""clock1"":{""hour"":15,""minute"":37},""clock2"":{""hour"":15,""minute"":37}}", -"equal","{""clock1"":{""hour"":15,""minute"":36},""clock2"":{""hour"":15,""minute"":37}}", -"equal","{""clock1"":{""hour"":14,""minute"":37},""clock2"":{""hour"":15,""minute"":37}}", -"equal","{""clock1"":{""hour"":10,""minute"":37},""clock2"":{""hour"":34,""minute"":37}}", -"equal","{""clock1"":{""hour"":3,""minute"":11},""clock2"":{""hour"":99,""minute"":11}}", -"equal","{""clock1"":{""hour"":22,""minute"":40},""clock2"":{""hour"":-2,""minute"":40}}", -"equal","{""clock1"":{""hour"":17,""minute"":3},""clock2"":{""hour"":-31,""minute"":3}}", -"equal","{""clock1"":{""hour"":13,""minute"":49},""clock2"":{""hour"":-83,""minute"":49}}", -"equal","{""clock1"":{""hour"":0,""minute"":1},""clock2"":{""hour"":0,""minute"":1441}}", -"equal","{""clock1"":{""hour"":2,""minute"":2},""clock2"":{""hour"":2,""minute"":4322}}", -"equal","{""clock1"":{""hour"":2,""minute"":40},""clock2"":{""hour"":3,""minute"":-20}}", -"equal","{""clock1"":{""hour"":4,""minute"":10},""clock2"":{""hour"":5,""minute"":-1490}}", -"equal","{""clock1"":{""hour"":6,""minute"":15},""clock2"":{""hour"":6,""minute"":-4305}}", -"equal","{""clock1"":{""hour"":7,""minute"":32},""clock2"":{""hour"":-12,""minute"":-268}}", -"equal","{""clock1"":{""hour"":18,""minute"":7},""clock2"":{""hour"":-54,""minute"":-11513}}", -"equal","{""clock1"":{""hour"":24,""minute"":0},""clock2"":{""hour"":0,""minute"":0}}", +"create","{""hour"":8,""minute"":0}","" +"create","{""hour"":11,""minute"":9}","" +"create","{""hour"":24,""minute"":0}","" +"create","{""hour"":25,""minute"":0}","" +"create","{""hour"":100,""minute"":0}","" +"create","{""hour"":1,""minute"":60}","" +"create","{""hour"":0,""minute"":160}","" +"create","{""hour"":0,""minute"":1723}","" +"create","{""hour"":25,""minute"":160}","" +"create","{""hour"":201,""minute"":3001}","" +"create","{""hour"":72,""minute"":8640}","" +"create","{""hour"":-1,""minute"":15}","" +"create","{""hour"":-25,""minute"":0}","" +"create","{""hour"":-91,""minute"":0}","" +"create","{""hour"":1,""minute"":-40}","" +"create","{""hour"":1,""minute"":-160}","" +"create","{""hour"":1,""minute"":-4820}","" +"create","{""hour"":2,""minute"":-60}","" +"create","{""hour"":-25,""minute"":-160}","" +"create","{""hour"":-121,""minute"":-5810}","" +"add","{""hour"":10,""minute"":0,""value"":3}","" +"add","{""hour"":6,""minute"":41,""value"":0}","" +"add","{""hour"":0,""minute"":45,""value"":40}","" +"add","{""hour"":10,""minute"":0,""value"":61}","" +"add","{""hour"":0,""minute"":45,""value"":160}","" +"add","{""hour"":23,""minute"":59,""value"":2}","" +"add","{""hour"":5,""minute"":32,""value"":1500}","" +"add","{""hour"":1,""minute"":1,""value"":3500}","" +"subtract","{""hour"":10,""minute"":3,""value"":3}","" +"subtract","{""hour"":10,""minute"":3,""value"":30}","" +"subtract","{""hour"":10,""minute"":3,""value"":70}","" +"subtract","{""hour"":0,""minute"":3,""value"":4}","" +"subtract","{""hour"":0,""minute"":0,""value"":160}","" +"subtract","{""hour"":6,""minute"":15,""value"":160}","" +"subtract","{""hour"":5,""minute"":32,""value"":1500}","" +"subtract","{""hour"":2,""minute"":20,""value"":3000}","" +"equal","{""clock1"":{""hour"":15,""minute"":37},""clock2"":{""hour"":15,""minute"":37}}","" +"equal","{""clock1"":{""hour"":15,""minute"":36},""clock2"":{""hour"":15,""minute"":37}}","" +"equal","{""clock1"":{""hour"":14,""minute"":37},""clock2"":{""hour"":15,""minute"":37}}","" +"equal","{""clock1"":{""hour"":10,""minute"":37},""clock2"":{""hour"":34,""minute"":37}}","" +"equal","{""clock1"":{""hour"":3,""minute"":11},""clock2"":{""hour"":99,""minute"":11}}","" +"equal","{""clock1"":{""hour"":22,""minute"":40},""clock2"":{""hour"":-2,""minute"":40}}","" +"equal","{""clock1"":{""hour"":17,""minute"":3},""clock2"":{""hour"":-31,""minute"":3}}","" +"equal","{""clock1"":{""hour"":13,""minute"":49},""clock2"":{""hour"":-83,""minute"":49}}","" +"equal","{""clock1"":{""hour"":0,""minute"":1},""clock2"":{""hour"":0,""minute"":1441}}","" +"equal","{""clock1"":{""hour"":2,""minute"":2},""clock2"":{""hour"":2,""minute"":4322}}","" +"equal","{""clock1"":{""hour"":2,""minute"":40},""clock2"":{""hour"":3,""minute"":-20}}","" +"equal","{""clock1"":{""hour"":4,""minute"":10},""clock2"":{""hour"":5,""minute"":-1490}}","" +"equal","{""clock1"":{""hour"":6,""minute"":15},""clock2"":{""hour"":6,""minute"":-4305}}","" +"equal","{""clock1"":{""hour"":7,""minute"":32},""clock2"":{""hour"":-12,""minute"":-268}}","" +"equal","{""clock1"":{""hour"":18,""minute"":7},""clock2"":{""hour"":-54,""minute"":-11513}}","" +"equal","{""clock1"":{""hour"":24,""minute"":0},""clock2"":{""hour"":0,""minute"":0}}","" diff --git a/exercises/practice/collatz-conjecture/.meta/template.data.j2 b/exercises/practice/collatz-conjecture/.meta/template.data.j2 new file mode 100644 index 00000000..64546678 --- /dev/null +++ b/exercises/practice/collatz-conjecture/.meta/template.data.j2 @@ -0,0 +1,3 @@ +{%- for case in cases -%} +{{ [case["input"]["number"]] | tocsv }},"" +{% endfor %} diff --git a/exercises/practice/crypto-square/.meta/template.create_test_table.j2 b/exercises/practice/crypto-square/.meta/template.create_test_table.j2 new file mode 100644 index 00000000..4429ce4c --- /dev/null +++ b/exercises/practice/crypto-square/.meta/template.create_test_table.j2 @@ -0,0 +1,32 @@ +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 + plaintext TEXT NOT NULL, + expected TEXT NOT NULL +); + +INSERT INTO + tests (uuid, description, plaintext, expected) +VALUES +{%- for case in cases %} + ( + '{{ case["uuid"] }}', + '{{ case["description"] }}', + '{{ case["input"]["plaintext"] }}', + '{{ case["expected"] }}' +{%- if loop.last %} + ); +{%- else %} + ), +{%- endif %} +{%- endfor %} diff --git a/exercises/practice/crypto-square/.meta/template.data.j2 b/exercises/practice/crypto-square/.meta/template.data.j2 new file mode 100644 index 00000000..8e1c616e --- /dev/null +++ b/exercises/practice/crypto-square/.meta/template.data.j2 @@ -0,0 +1,3 @@ +{%- for case in cases -%} +{{ [case["input"]["plaintext"]] | tocsv }},"" +{% endfor %} diff --git a/exercises/practice/crypto-square/data.csv b/exercises/practice/crypto-square/data.csv index ddfdd3ec..87d04827 100644 --- a/exercises/practice/crypto-square/data.csv +++ b/exercises/practice/crypto-square/data.csv @@ -1,8 +1,8 @@ -"", -"... --- ...", -"A", -" b ", -"@1,%!", -"This is fun!", -"Chill out.", -"If man was meant to stay on the ground, god would have given us roots.", +"","" +"... --- ...","" +"A","" +" b ","" +"@1,%!","" +"This is fun!","" +"Chill out.","" +"If man was meant to stay on the ground, god would have given us roots.",""