Skip to content

Commit

Permalink
hamming: sync (#1978)
Browse files Browse the repository at this point in the history
[no important files changed]

part of #1824
  • Loading branch information
senekor authored Aug 16, 2024
1 parent 2d06f69 commit 41f2551
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 53 deletions.
16 changes: 16 additions & 0 deletions exercises/practice/hamming/.meta/test_template.tera
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
use hamming::*;

{% for test in cases %}
#[test]
#[ignore]
fn {{ test.description | make_ident }}() {
assert_eq!(
hamming_distance({{ test.input.strand1 | json_encode() }}, {{ test.input.strand2 | json_encode() }}),
{% if test.expected is object -%}
None
{% else -%}
Some({{ test.expected }})
{% endif -%}
);
}
{% endfor -%}
70 changes: 67 additions & 3 deletions exercises/practice/hamming/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,67 @@
# 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.

[f6dcb64f-03b0-4b60-81b1-3c9dbf47e887]
description = "empty strands"

[54681314-eee2-439a-9db0-b0636c656156]
description = "single letter identical strands"

[294479a3-a4c8-478f-8d63-6209815a827b]
description = "single letter different strands"

[9aed5f34-5693-4344-9b31-40c692fb5592]
description = "long identical strands"

[cd2273a5-c576-46c8-a52b-dee251c3e6e5]
description = "long different strands"

[919f8ef0-b767-4d1b-8516-6379d07fcb28]
description = "disallow first strand longer"
include = false

[b9228bb1-465f-4141-b40f-1f99812de5a8]
description = "disallow first strand longer"
reimplements = "919f8ef0-b767-4d1b-8516-6379d07fcb28"

[8a2d4ed0-ead5-4fdd-924d-27c4cf56e60e]
description = "disallow second strand longer"
include = false

[dab38838-26bb-4fff-acbe-3b0a9bfeba2d]
description = "disallow second strand longer"
reimplements = "8a2d4ed0-ead5-4fdd-924d-27c4cf56e60e"

[5dce058b-28d4-4ca7-aa64-adfe4e17784c]
description = "disallow left empty strand"
include = false

[db92e77e-7c72-499d-8fe6-9354d2bfd504]
description = "disallow left empty strand"
include = false
reimplements = "5dce058b-28d4-4ca7-aa64-adfe4e17784c"

[b764d47c-83ff-4de2-ab10-6cfe4b15c0f3]
description = "disallow empty first strand"
reimplements = "db92e77e-7c72-499d-8fe6-9354d2bfd504"

[38826d4b-16fb-4639-ac3e-ba027dec8b5f]
description = "disallow right empty strand"
include = false

[920cd6e3-18f4-4143-b6b8-74270bb8f8a3]
description = "disallow right empty strand"
include = false
reimplements = "38826d4b-16fb-4639-ac3e-ba027dec8b5f"

[9ab9262f-3521-4191-81f5-0ed184a5aa89]
description = "disallow empty second strand"
reimplements = "920cd6e3-18f4-4143-b6b8-74270bb8f8a3"
65 changes: 15 additions & 50 deletions exercises/practice/hamming/tests/hamming.rs
Original file line number Diff line number Diff line change
@@ -1,89 +1,54 @@
fn process_distance_case(strand_pair: [&str; 2], expected_distance: Option<usize>) {
assert_eq!(
hamming::hamming_distance(strand_pair[0], strand_pair[1]),
expected_distance
);
}
use hamming::*;

#[test]
fn empty_strands() {
process_distance_case(["", ""], Some(0));
}

#[test]
#[ignore]
/// disallow first strand longer
fn disallow_first_strand_longer() {
process_distance_case(["AATG", "AAA"], None);
assert_eq!(hamming_distance("", ""), Some(0));
}

#[test]
#[ignore]
/// disallow second strand longer
fn disallow_second_strand_longer() {
process_distance_case(["ATA", "AGTG"], None);
}

#[test]
#[ignore]
fn first_string_is_longer() {
process_distance_case(["AAA", "AA"], None);
}

#[test]
#[ignore]
fn second_string_is_longer() {
process_distance_case(["A", "AA"], None);
}

#[test]
#[ignore]
/// single letter identical strands
fn single_letter_identical_strands() {
process_distance_case(["A", "A"], Some(0));
assert_eq!(hamming_distance("A", "A"), Some(0));
}

#[test]
#[ignore]
/// small distance
fn single_letter_different_strands() {
process_distance_case(["G", "T"], Some(1));
assert_eq!(hamming_distance("G", "T"), Some(1));
}

#[test]
#[ignore]
/// long identical strands
fn long_identical_strands() {
process_distance_case(["GGACTGAAATCTG", "GGACTGAAATCTG"], Some(0));
assert_eq!(hamming_distance("GGACTGAAATCTG", "GGACTGAAATCTG"), Some(0));
}

#[test]
#[ignore]
fn no_difference_between_identical_strands() {
process_distance_case(["GGACTGA", "GGACTGA"], Some(0));
fn long_different_strands() {
assert_eq!(hamming_distance("GGACGGATTCTG", "AGGACGGATTCT"), Some(9));
}

#[test]
#[ignore]
fn complete_hamming_distance_in_small_strand() {
process_distance_case(["ACT", "GGA"], Some(3));
fn disallow_first_strand_longer() {
assert_eq!(hamming_distance("AATG", "AAA"), None);
}

#[test]
#[ignore]
fn small_hamming_distance_in_the_middle_somewhere() {
process_distance_case(["GGACG", "GGTCG"], Some(1));
fn disallow_second_strand_longer() {
assert_eq!(hamming_distance("ATA", "AGTG"), None);
}

#[test]
#[ignore]
fn larger_distance() {
process_distance_case(["ACCAGGG", "ACTATGG"], Some(2));
fn disallow_empty_first_strand() {
assert_eq!(hamming_distance("", "G"), None);
}

#[test]
#[ignore]
/// large distance in off-by-one strand
fn long_different_strands() {
process_distance_case(["GGACGGATTCTG", "AGGACGGATTCT"], Some(9));
fn disallow_empty_second_strand() {
assert_eq!(hamming_distance("G", ""), None);
}

0 comments on commit 41f2551

Please sign in to comment.