Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions exercises/practice/acronym/.meta/test_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from lib import assert_eq, d_string


def gen_case(case):
prop = case["property"]
phrase = d_string(case["input"]["phrase"])
expected = d_string(case["expected"])
return [
f"string phrase = {phrase};",
assert_eq(f"{prop}(phrase)", expected),
]
5 changes: 2 additions & 3 deletions exercises/practice/acronym/source/acronym.d
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,14 @@ unittest
{
immutable int allTestsEnabled = 0;

// Basic abbreviation
// Basic
{
string phrase = "Portable Network Graphics";
assert(abbreviate(phrase) == "PNG");
}

static if (allTestsEnabled)
{

// Lowercase words
{
string phrase = "Ruby on Rails";
Expand All @@ -36,7 +35,7 @@ unittest
assert(abbreviate(phrase) == "GIMP");
}

// punctuation without whitespace
// Punctuation without whitespace
{
string phrase = "Complementary metal-oxide semiconductor";
assert(abbreviate(phrase) == "CMOS");
Expand Down
12 changes: 12 additions & 0 deletions exercises/practice/affine-cipher/.meta/test_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from lib import assert_equal, assert_throws, d_int, d_string, is_error


def gen_case(case):
prop = case["property"]
phrase = d_string(case["input"]["phrase"])
a = d_int(case["input"]["key"]["a"])
b = d_int(case["input"]["key"]["b"])
call = f"{prop}({phrase}, {a}, {b})"
if is_error(case["expected"]):
return assert_throws(call)
return assert_equal(d_string(case["expected"]), call)
59 changes: 0 additions & 59 deletions exercises/practice/affine-cipher/example/affine_cipher.d
Original file line number Diff line number Diff line change
Expand Up @@ -72,62 +72,3 @@ private immutable uint[] inverses = [
25,
0
];

unittest
{
import std.algorithm.comparison : equal;
import std.exception : assertThrown;

immutable int allTestsEnabled = 0;

// Encode-encode yes
assert(equal("xbt", encode("yes", 5, 7)));

static if (allTestsEnabled)
{
// Encode-encode no
assert(equal("fu", encode("no", 15, 18)));

// Encode-encode OMG
assert(equal("lvz", encode("OMG", 21, 3)));

// Encode-encode O M G
assert(equal("hjp", encode("O M G", 25, 47)));

// Encode-encode mindblowingly
assert(equal("rzcwa gnxzc dgt", encode("mindblowingly", 11, 15)));

// Encode-encode numbers
assert(equal("jqgjc rw123 jqgjc rw", encode("Testing,1 2 3, testing.", 3, 4)));

// Encode-encode deep thought
assert(equal("iynia fdqfb ifje", encode("Truth is fiction.", 5, 17)));

// Encode-encode all the letters
assert(equal("swxtj npvyk lruol iejdc blaxk swxmh qzglf", encode("The quick brown fox jumps over the lazy dog.", 17, 33)));

// Encode-encode with a not coprime to m
assertThrown(encode("This is a test.", 6, 17));

// Decode-decode exercism
assert(equal("exercism", decode("tytgn fjr", 3, 7)));

// Decode-decode a sentence
assert(equal("anobstacleisoftenasteppingstone", decode("qdwju nqcro muwhn odqun oppmd aunwd o", 19, 16)));

// Decode-decode numbers
assert(equal("testing123testing", decode("odpoz ub123 odpoz ub", 25, 7)));

// Decode-decode all the letters
assert(equal("thequickbrownfoxjumpsoverthelazydog", decode("swxtj npvyk lruol iejdc blaxk swxmh qzglf", 17, 33)));

// Decode-decode with no spaces in input
assert(equal("thequickbrownfoxjumpsoverthelazydog", decode("swxtjnpvyklruoliejdcblaxkswxmhqzglf", 17, 33)));

// Decode-decode with too many spaces
assert(equal("jollygreengiant", decode("vszzm cly yd cg qdp", 15, 16)));

// Decode-decode with a not coprime to m
assertThrown(decode("Test", 13, 5));
}
}
32 changes: 16 additions & 16 deletions exercises/practice/affine-cipher/source/affine_cipher.d
Original file line number Diff line number Diff line change
Expand Up @@ -17,54 +17,54 @@ unittest

immutable int allTestsEnabled = 0;

// Encode-encode yes
// Encode - encode yes
assert(equal("xbt", encode("yes", 5, 7)));

static if (allTestsEnabled)
{
// Encode-encode no
// Encode - encode no
assert(equal("fu", encode("no", 15, 18)));

// Encode-encode OMG
// Encode - encode OMG
assert(equal("lvz", encode("OMG", 21, 3)));

// Encode-encode O M G
// Encode - encode O M G
assert(equal("hjp", encode("O M G", 25, 47)));

// Encode-encode mindblowingly
// Encode - encode mindblowingly
assert(equal("rzcwa gnxzc dgt", encode("mindblowingly", 11, 15)));

// Encode-encode numbers
// Encode - encode numbers
assert(equal("jqgjc rw123 jqgjc rw", encode("Testing,1 2 3, testing.", 3, 4)));

// Encode-encode deep thought
// Encode - encode deep thought
assert(equal("iynia fdqfb ifje", encode("Truth is fiction.", 5, 17)));

// Encode-encode all the letters
// Encode - encode all the letters
assert(equal("swxtj npvyk lruol iejdc blaxk swxmh qzglf", encode("The quick brown fox jumps over the lazy dog.", 17, 33)));

// Encode-encode with a not coprime to m
// Encode - encode with a not coprime to m
assertThrown(encode("This is a test.", 6, 17));

// Decode-decode exercism
// Decode - decode exercism
assert(equal("exercism", decode("tytgn fjr", 3, 7)));

// Decode-decode a sentence
// Decode - decode a sentence
assert(equal("anobstacleisoftenasteppingstone", decode("qdwju nqcro muwhn odqun oppmd aunwd o", 19, 16)));

// Decode-decode numbers
// Decode - decode numbers
assert(equal("testing123testing", decode("odpoz ub123 odpoz ub", 25, 7)));

// Decode-decode all the letters
// Decode - decode all the letters
assert(equal("thequickbrownfoxjumpsoverthelazydog", decode("swxtj npvyk lruol iejdc blaxk swxmh qzglf", 17, 33)));

// Decode-decode with no spaces in input
// Decode - decode with no spaces in input
assert(equal("thequickbrownfoxjumpsoverthelazydog", decode("swxtjnpvyklruoliejdcblaxkswxmhqzglf", 17, 33)));

// Decode-decode with too many spaces
// Decode - decode with too many spaces
assert(equal("jollygreengiant", decode("vszzm cly yd cg qdp", 15, 16)));

// Decode-decode with a not coprime to m
// Decode - decode with a not coprime to m
assertThrown(decode("Test", 13, 5));
}
}
2 changes: 1 addition & 1 deletion exercises/practice/all-your-base/.meta/test_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ def gen_case(case):
else:
lines.append(f"int[] expected = {d_array(case['expected'])};")
lines.append(assert_eq(call, "expected"))
return "\n".join(lines)
return lines
15 changes: 15 additions & 0 deletions exercises/practice/alphametics/.meta/test_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from lib import assert_eq, assert_throws, d_string


def solution(puzzle, digits):
"""Replace each letter of the puzzle by its digit."""
return "".join(str(digits.get(char, char)) for char in puzzle)


def gen_case(case):
prop = case["property"]
puzzle = case["input"]["puzzle"]
call = f"{prop}({d_string(puzzle)})"
if case["expected"] is None:
return assert_throws(call)
return assert_eq(call, d_string(solution(puzzle, case["expected"])))
10 changes: 10 additions & 0 deletions exercises/practice/armstrong-numbers/.meta/test_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from lib import assert_false, assert_true, d_int


def gen_case(case):
prop = case["property"]
number = d_int(case["input"]["number"])
call = f"{prop}({number})"
if case["expected"]:
return assert_true(call)
return assert_false(call)
16 changes: 8 additions & 8 deletions exercises/practice/armstrong-numbers/source/armstrong_numbers.d
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,28 @@ unittest

static if (allTestsEnabled)
{
// Single digit numbers are Armstrong numbers
// Single-digit numbers are Armstrong numbers
assert(isArmstrongNumber(5));

// There are no 2 digit Armstrong numbers
// There are no two-digit Armstrong numbers
assert(!isArmstrongNumber(10));

// Three digit number that is an Armstrong number
// Three-digit number that is an Armstrong number
assert(isArmstrongNumber(153));

// Three digit number that is not an Armstrong number
// Three-digit number that is not an Armstrong number
assert(!isArmstrongNumber(100));

// Four digit number that is an Armstrong number
// Four-digit number that is an Armstrong number
assert(isArmstrongNumber(9474));

// Four digit number that is not an Armstrong number
// Four-digit number that is not an Armstrong number
assert(!isArmstrongNumber(9475));

// Seven digit number that is an Armstrong number
// Seven-digit number that is an Armstrong number
assert(isArmstrongNumber(9926315));

// Seven digit number that is not an Armstrong number
// Seven-digit number that is not an Armstrong number
assert(!isArmstrongNumber(9926314));
}
}
13 changes: 13 additions & 0 deletions exercises/practice/atbash-cipher/.meta/test_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from lib import assert_eq, d_string


def describe(case):
description = case["description"]
return description[:1].upper() + description[1:]


def gen_case(case):
prop = case["property"]
phrase = d_string(case["input"]["phrase"])
expected = d_string(case["expected"])
return assert_eq(f"{prop}({phrase})", expected)
7 changes: 7 additions & 0 deletions exercises/practice/bob/.meta/test_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from lib import assert_eq, d_string


def gen_case(case):
text = d_string(case["input"]["heyBob"])
expected = d_string(case["expected"])
return assert_eq(f"hey({text})", expected)
11 changes: 11 additions & 0 deletions exercises/practice/book-store/.meta/test_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from lib import assert_eq, d_inline_array, d_int


def gen_case(case):
prop = case["property"]
basket = d_inline_array(case["input"]["basket"])
expected = d_int(case["expected"])
return [
f"immutable int[] basket = {basket};",
assert_eq(f"{prop}(basket)", expected),
]
9 changes: 3 additions & 6 deletions exercises/practice/book-store/source/book_store.d
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,9 @@ unittest
assert(total(basket) == 10240);
}

// Check that groups of four are created properly even when there are
// more groups of three than groups of five
// Check that groups of four are created properly even when there are more groups of three than groups of five
{
immutable int[] basket = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 4, 4, 5, 5];
immutable int[] basket = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5];
assert(total(basket) == 14560);
}

Expand All @@ -115,8 +113,7 @@ unittest
assert(total(basket) == 3360);
}

// One group of one and two plus three groups of four is cheaper than
// one group of each size
// One group of one and two plus three groups of four is cheaper than one group of each size
{
immutable int[] basket = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5];
assert(total(basket) == 10000);
Expand Down
11 changes: 11 additions & 0 deletions exercises/practice/bottle-song/.meta/test_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from lib import assert_eq, d_int, d_lines


def gen_case(case):
prop = case["property"]
start_bottles = d_int(case["input"]["startBottles"])
take_down = d_int(case["input"]["takeDown"])
return [
f"string expected =\n{d_lines(case['expected'])};",
assert_eq(f"{prop}({start_bottles}, {take_down})", "expected"),
]
14 changes: 7 additions & 7 deletions exercises/practice/bottle-song/source/bottle_song.d
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ unittest
{
immutable int allTestsEnabled = 0;

// Verse-single verse-first generic verse
// Verse - single verse - first generic verse
{
string expected =
"Ten green bottles hanging on the wall,\n" ~
Expand All @@ -21,7 +21,7 @@ unittest

static if (allTestsEnabled)
{
// Verse-single verse-last generic verse
// Verse - single verse - last generic verse
{
string expected =
"Three green bottles hanging on the wall,\n" ~
Expand All @@ -31,7 +31,7 @@ unittest
assert(recite(3, 1) == expected);
}

// Verse-single verse-verse with 2 bottles
// Verse - single verse - verse with 2 bottles
{
string expected =
"Two green bottles hanging on the wall,\n" ~
Expand All @@ -41,7 +41,7 @@ unittest
assert(recite(2, 1) == expected);
}

// Verse-single verse-verse with 1 bottle
// Verse - single verse - verse with 1 bottle
{
string expected =
"One green bottle hanging on the wall,\n" ~
Expand All @@ -51,7 +51,7 @@ unittest
assert(recite(1, 1) == expected);
}

// Lyrics-multiple verses-first two verses
// Lyrics - multiple verses - first two verses
{
string expected =
"Ten green bottles hanging on the wall,\n" ~
Expand All @@ -66,7 +66,7 @@ unittest
assert(recite(10, 2) == expected);
}

// Lyrics-multiple verses-last three verses
// Lyrics - multiple verses - last three verses
{
string expected =
"Three green bottles hanging on the wall,\n" ~
Expand All @@ -86,7 +86,7 @@ unittest
assert(recite(3, 3) == expected);
}

// Lyrics-multiple verses-all verses
// Lyrics - multiple verses - all verses
{
string expected =
"Ten green bottles hanging on the wall,\n" ~
Expand Down
Loading
Loading