diff --git a/exercises/practice/clock/.meta/test_template.tera b/exercises/practice/clock/.meta/test_template.tera new file mode 100644 index 000000000..a9510c022 --- /dev/null +++ b/exercises/practice/clock/.meta/test_template.tera @@ -0,0 +1,49 @@ +use clock::*; + +// +// Clock Creation +// + +{% for test in cases.0.cases %} +#[test] +#[ignore] +fn {{ test.description | make_ident }}() { + assert_eq!(Clock::new({{ test.input.hour }}, {{ test.input.minute }}).to_string(), {{ test.expected | json_encode() }}); +} +{% endfor %} + +// +// Clock Math +// + +{% for test in cases.1.cases %} +#[test] +#[ignore] +fn {{ test.description | make_ident }}() { + let clock = Clock::new({{ test.input.hour }}, {{ test.input.minute }}).add_minutes({{ test.input.value }}); + assert_eq!(clock.to_string(), {{ test.expected | json_encode() }}); +} +{% endfor %} + +{% for test in cases.2.cases %} +#[test] +#[ignore] +fn {{ test.description | make_ident }}() { + let clock = Clock::new({{ test.input.hour }}, {{ test.input.minute }}).add_minutes(-{{ test.input.value }}); + assert_eq!(clock.to_string(), {{ test.expected | json_encode() }}); +} +{% endfor %} + +{% for test in cases.3.cases %} +#[test] +#[ignore] +fn {{ test.description | make_ident }}() { + {% set c1 = test.input.clock1 %} + {% set c2 = test.input.clock2 %} + {% if test.expected -%} + assert_eq!(Clock::new({{ c1.hour }}, {{ c1.minute }}), Clock::new({{ c2.hour }}, {{ c2.minute }})); + {% else -%} + assert_ne!(Clock::new({{ c1.hour }}, {{ c1.minute }}), Clock::new({{ c2.hour }}, {{ c2.minute }})); + {% endif -%} +} +{% endfor %} diff --git a/exercises/practice/clock/.meta/tests.toml b/exercises/practice/clock/.meta/tests.toml index be690e975..712c87bca 100644 --- a/exercises/practice/clock/.meta/tests.toml +++ b/exercises/practice/clock/.meta/tests.toml @@ -1,3 +1,166 @@ -# This is an auto-generated file. Regular comments will be removed when this -# file is regenerated. Regenerating will not touch any manually added keys, -# so comments can be added in a "comment" key. +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[a577bacc-106b-496e-9792-b3083ea8705e] +description = "Create a new clock with an initial time -> on the hour" + +[b5d0c360-3b88-489b-8e84-68a1c7a4fa23] +description = "Create a new clock with an initial time -> past the hour" + +[473223f4-65f3-46ff-a9f7-7663c7e59440] +description = "Create a new clock with an initial time -> midnight is zero hours" + +[ca95d24a-5924-447d-9a96-b91c8334725c] +description = "Create a new clock with an initial time -> hour rolls over" + +[f3826de0-0925-4d69-8ac8-89aea7e52b78] +description = "Create a new clock with an initial time -> hour rolls over continuously" + +[a02f7edf-dfd4-4b11-b21a-86de3cc6a95c] +description = "Create a new clock with an initial time -> sixty minutes is next hour" + +[8f520df6-b816-444d-b90f-8a477789beb5] +description = "Create a new clock with an initial time -> minutes roll over" + +[c75c091b-47ac-4655-8d40-643767fc4eed] +description = "Create a new clock with an initial time -> minutes roll over continuously" + +[06343ecb-cf39-419d-a3f5-dcbae0cc4c57] +description = "Create a new clock with an initial time -> hour and minutes roll over" + +[be60810e-f5d9-4b58-9351-a9d1e90e660c] +description = "Create a new clock with an initial time -> hour and minutes roll over continuously" + +[1689107b-0b5c-4bea-aad3-65ec9859368a] +description = "Create a new clock with an initial time -> hour and minutes roll over to exactly midnight" + +[d3088ee8-91b7-4446-9e9d-5e2ad6219d91] +description = "Create a new clock with an initial time -> negative hour" + +[77ef6921-f120-4d29-bade-80d54aa43b54] +description = "Create a new clock with an initial time -> negative hour rolls over" + +[359294b5-972f-4546-bb9a-a85559065234] +description = "Create a new clock with an initial time -> negative hour rolls over continuously" + +[509db8b7-ac19-47cc-bd3a-a9d2f30b03c0] +description = "Create a new clock with an initial time -> negative minutes" + +[5d6bb225-130f-4084-84fd-9e0df8996f2a] +description = "Create a new clock with an initial time -> negative minutes roll over" + +[d483ceef-b520-4f0c-b94a-8d2d58cf0484] +description = "Create a new clock with an initial time -> negative minutes roll over continuously" + +[1cd19447-19c6-44bf-9d04-9f8305ccb9ea] +description = "Create a new clock with an initial time -> negative sixty minutes is previous hour" + +[9d3053aa-4f47-4afc-bd45-d67a72cef4dc] +description = "Create a new clock with an initial time -> negative hour and minutes both roll over" + +[51d41fcf-491e-4ca0-9cae-2aa4f0163ad4] +description = "Create a new clock with an initial time -> negative hour and minutes both roll over continuously" + +[d098e723-ad29-4ef9-997a-2693c4c9d89a] +description = "Add minutes -> add minutes" + +[b6ec8f38-e53e-4b22-92a7-60dab1f485f4] +description = "Add minutes -> add no minutes" + +[efd349dd-0785-453e-9ff8-d7452a8e7269] +description = "Add minutes -> add to next hour" + +[749890f7-aba9-4702-acce-87becf4ef9fe] +description = "Add minutes -> add more than one hour" + +[da63e4c1-1584-46e3-8d18-c9dc802c1713] +description = "Add minutes -> add more than two hours with carry" + +[be167a32-3d33-4cec-a8bc-accd47ddbb71] +description = "Add minutes -> add across midnight" + +[6672541e-cdae-46e4-8be7-a820cc3be2a8] +description = "Add minutes -> add more than one day (1500 min = 25 hrs)" + +[1918050d-c79b-4cb7-b707-b607e2745c7e] +description = "Add minutes -> add more than two days" + +[37336cac-5ede-43a5-9026-d426cbe40354] +description = "Subtract minutes -> subtract minutes" + +[0aafa4d0-3b5f-4b12-b3af-e3a9e09c047b] +description = "Subtract minutes -> subtract to previous hour" + +[9b4e809c-612f-4b15-aae0-1df0acb801b9] +description = "Subtract minutes -> subtract more than an hour" + +[8b04bb6a-3d33-4e6c-8de9-f5de6d2c70d6] +description = "Subtract minutes -> subtract across midnight" + +[07c3bbf7-ce4d-4658-86e8-4a77b7a5ccd9] +description = "Subtract minutes -> subtract more than two hours" + +[90ac8a1b-761c-4342-9c9c-cdc3ed5db097] +description = "Subtract minutes -> subtract more than two hours with borrow" + +[2149f985-7136-44ad-9b29-ec023a97a2b7] +description = "Subtract minutes -> subtract more than one day (1500 min = 25 hrs)" + +[ba11dbf0-ac27-4acb-ada9-3b853ec08c97] +description = "Subtract minutes -> subtract more than two days" + +[f2fdad51-499f-4c9b-a791-b28c9282e311] +description = "Compare two clocks for equality -> clocks with same time" + +[5d409d4b-f862-4960-901e-ec430160b768] +description = "Compare two clocks for equality -> clocks a minute apart" + +[a6045fcf-2b52-4a47-8bb2-ef10a064cba5] +description = "Compare two clocks for equality -> clocks an hour apart" + +[66b12758-0be5-448b-a13c-6a44bce83527] +description = "Compare two clocks for equality -> clocks with hour overflow" + +[2b19960c-212e-4a71-9aac-c581592f8111] +description = "Compare two clocks for equality -> clocks with hour overflow by several days" + +[6f8c6541-afac-4a92-b0c2-b10d4e50269f] +description = "Compare two clocks for equality -> clocks with negative hour" + +[bb9d5a68-e324-4bf5-a75e-0e9b1f97a90d] +description = "Compare two clocks for equality -> clocks with negative hour that wraps" + +[56c0326d-565b-4d19-a26f-63b3205778b7] +description = "Compare two clocks for equality -> clocks with negative hour that wraps multiple times" + +[c90b9de8-ddff-4ffe-9858-da44a40fdbc2] +description = "Compare two clocks for equality -> clocks with minute overflow" + +[533a3dc5-59a7-491b-b728-a7a34fe325de] +description = "Compare two clocks for equality -> clocks with minute overflow by several days" + +[fff49e15-f7b7-4692-a204-0f6052d62636] +description = "Compare two clocks for equality -> clocks with negative minute" + +[605c65bb-21bd-43eb-8f04-878edf508366] +description = "Compare two clocks for equality -> clocks with negative minute that wraps" + +[b87e64ed-212a-4335-91fd-56da8421d077] +description = "Compare two clocks for equality -> clocks with negative minute that wraps multiple times" + +[822fbf26-1f3b-4b13-b9bf-c914816b53dd] +description = "Compare two clocks for equality -> clocks with negative hours and minutes" + +[e787bccd-cf58-4a1d-841c-ff80eaaccfaa] +description = "Compare two clocks for equality -> clocks with negative hours and minutes that wrap" + +[96969ca8-875a-48a1-86ae-257a528c44f5] +description = "Compare two clocks for equality -> full clock and zeroed clock" diff --git a/exercises/practice/clock/tests/clock.rs b/exercises/practice/clock/tests/clock.rs index 416a6f985..5a2bd5a48 100644 --- a/exercises/practice/clock/tests/clock.rs +++ b/exercises/practice/clock/tests/clock.rs @@ -1,4 +1,4 @@ -use clock::Clock; +use clock::*; // // Clock Creation @@ -53,19 +53,19 @@ fn minutes_roll_over_continuously() { #[test] #[ignore] -fn hours_and_minutes_roll_over() { +fn hour_and_minutes_roll_over() { assert_eq!(Clock::new(25, 160).to_string(), "03:40"); } #[test] #[ignore] -fn hours_and_minutes_roll_over_continuously() { +fn hour_and_minutes_roll_over_continuously() { assert_eq!(Clock::new(201, 3001).to_string(), "11:01"); } #[test] #[ignore] -fn hours_and_minutes_roll_over_to_exactly_midnight() { +fn hour_and_minutes_roll_over_to_exactly_midnight() { assert_eq!(Clock::new(72, 8640).to_string(), "00:00"); } @@ -77,14 +77,14 @@ fn negative_hour() { #[test] #[ignore] -fn negative_hour_roll_over() { - assert_eq!(Clock::new(-25, 00).to_string(), "23:00"); +fn negative_hour_rolls_over() { + assert_eq!(Clock::new(-25, 0).to_string(), "23:00"); } #[test] #[ignore] -fn negative_hour_roll_over_continuously() { - assert_eq!(Clock::new(-91, 00).to_string(), "05:00"); +fn negative_hour_rolls_over_continuously() { + assert_eq!(Clock::new(-91, 0).to_string(), "05:00"); } #[test] @@ -107,16 +107,10 @@ fn negative_minutes_roll_over_continuously() { #[test] #[ignore] -fn negative_sixty_minutes_is_prev_hour() { +fn negative_sixty_minutes_is_previous_hour() { assert_eq!(Clock::new(2, -60).to_string(), "01:00"); } -#[test] -#[ignore] -fn negative_one_twenty_minutes_is_two_prev_hours() { - assert_eq!(Clock::new(1, -120).to_string(), "23:00"); -} - #[test] #[ignore] fn negative_hour_and_minutes_both_roll_over() { @@ -129,12 +123,6 @@ fn negative_hour_and_minutes_both_roll_over_continuously() { assert_eq!(Clock::new(-121, -5810).to_string(), "22:10"); } -#[test] -#[ignore] -fn zero_hour_and_negative_minutes() { - assert_eq!(Clock::new(0, -22).to_string(), "23:38"); -} - // // Clock Math // @@ -183,7 +171,7 @@ fn add_across_midnight() { #[test] #[ignore] -fn add_more_than_one_day() { +fn add_more_than_one_day_1500_min_25_hrs() { let clock = Clock::new(5, 32).add_minutes(1500); assert_eq!(clock.to_string(), "06:32"); } @@ -239,7 +227,7 @@ fn subtract_more_than_two_hours_with_borrow() { #[test] #[ignore] -fn subtract_more_than_one_day() { +fn subtract_more_than_one_day_1500_min_25_hrs() { let clock = Clock::new(5, 32).add_minutes(-1500); assert_eq!(clock.to_string(), "04:32"); } @@ -251,102 +239,98 @@ fn subtract_more_than_two_days() { assert_eq!(clock.to_string(), "00:20"); } -// -// Test Equality -// - #[test] #[ignore] -fn compare_clocks_for_equality() { +fn clocks_with_same_time() { assert_eq!(Clock::new(15, 37), Clock::new(15, 37)); } #[test] #[ignore] -fn compare_clocks_a_minute_apart() { +fn clocks_a_minute_apart() { assert_ne!(Clock::new(15, 36), Clock::new(15, 37)); } #[test] #[ignore] -fn compare_clocks_an_hour_apart() { +fn clocks_an_hour_apart() { assert_ne!(Clock::new(14, 37), Clock::new(15, 37)); } #[test] #[ignore] -fn compare_clocks_with_hour_overflow() { +fn clocks_with_hour_overflow() { assert_eq!(Clock::new(10, 37), Clock::new(34, 37)); } #[test] #[ignore] -fn compare_clocks_with_hour_overflow_by_several_days() { - assert_eq!(Clock::new(99, 11), Clock::new(3, 11)); +fn clocks_with_hour_overflow_by_several_days() { + assert_eq!(Clock::new(3, 11), Clock::new(99, 11)); } #[test] #[ignore] -fn compare_clocks_with_negative_hour() { - assert_eq!(Clock::new(-2, 40), Clock::new(22, 40)); +fn clocks_with_negative_hour() { + assert_eq!(Clock::new(22, 40), Clock::new(-2, 40)); } #[test] #[ignore] -fn compare_clocks_with_negative_hour_that_wraps() { - assert_eq!(Clock::new(-31, 3), Clock::new(17, 3)); +fn clocks_with_negative_hour_that_wraps() { + assert_eq!(Clock::new(17, 3), Clock::new(-31, 3)); } #[test] #[ignore] -fn compare_clocks_with_negative_hour_that_wraps_multiple_times() { - assert_eq!(Clock::new(-83, 49), Clock::new(13, 49)); +fn clocks_with_negative_hour_that_wraps_multiple_times() { + assert_eq!(Clock::new(13, 49), Clock::new(-83, 49)); } #[test] #[ignore] -fn compare_clocks_with_minutes_overflow() { - assert_eq!(Clock::new(0, 1441), Clock::new(0, 1)); +fn clocks_with_minute_overflow() { + assert_eq!(Clock::new(0, 1), Clock::new(0, 1441)); } #[test] #[ignore] -fn compare_clocks_with_minutes_overflow_by_several_days() { - assert_eq!(Clock::new(2, 4322), Clock::new(2, 2)); +fn clocks_with_minute_overflow_by_several_days() { + assert_eq!(Clock::new(2, 2), Clock::new(2, 4322)); } #[test] #[ignore] -fn compare_clocks_with_negative_minute() { - assert_eq!(Clock::new(3, -20), Clock::new(2, 40)); +fn clocks_with_negative_minute() { + assert_eq!(Clock::new(2, 40), Clock::new(3, -20)); } #[test] #[ignore] -fn compare_clocks_with_negative_minute_that_wraps() { - assert_eq!(Clock::new(5, -1490), Clock::new(4, 10)); +fn clocks_with_negative_minute_that_wraps() { + assert_eq!(Clock::new(4, 10), Clock::new(5, -1490)); } #[test] #[ignore] -fn compare_clocks_with_negative_minute_that_wraps_multiple() { - assert_eq!(Clock::new(6, -4305), Clock::new(6, 15)); +fn clocks_with_negative_minute_that_wraps_multiple_times() { + assert_eq!(Clock::new(6, 15), Clock::new(6, -4305)); } #[test] #[ignore] -fn compare_clocks_with_negative_hours_and_minutes() { - assert_eq!(Clock::new(-12, -268), Clock::new(7, 32)); +fn clocks_with_negative_hours_and_minutes() { + assert_eq!(Clock::new(7, 32), Clock::new(-12, -268)); } #[test] #[ignore] -fn compare_clocks_with_negative_hours_and_minutes_that_wrap() { - assert_eq!(Clock::new(-54, -11_513), Clock::new(18, 7)); +fn clocks_with_negative_hours_and_minutes_that_wrap() { + assert_eq!(Clock::new(18, 7), Clock::new(-54, -11513)); } #[test] #[ignore] -fn compare_full_clock_and_zeroed_clock() { +fn full_clock_and_zeroed_clock() { assert_eq!(Clock::new(24, 0), Clock::new(0, 0)); }