Skip to content

Commit

Permalink
protein-translation: sync
Browse files Browse the repository at this point in the history
  • Loading branch information
senekor committed Apr 3, 2024
1 parent 7be6960 commit 962ce99
Show file tree
Hide file tree
Showing 4 changed files with 580 additions and 39 deletions.
182 changes: 182 additions & 0 deletions exercises/practice/protein-translation/.meta/additional-tests.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
[
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "methionine",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "AUG"
},
"expected": "Some(\"methionine\")"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "cysteine tgt",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "UGU"
},
"expected": "Some(\"cysteine\")"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "stop",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "UAA"
},
"expected": "Some(\"stop codon\")"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "valine",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "GUU"
},
"expected": "Some(\"valine\")"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "isoleucine",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "AUU"
},
"expected": "Some(\"isoleucine\")"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "arginine cga",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "CGA"
},
"expected": "Some(\"arginine\")"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "arginine aga",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "AGA"
},
"expected": "Some(\"arginine\")"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "arginine agg",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "AGG"
},
"expected": "Some(\"arginine\")"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "empty is invalid",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": ""
},
"expected": "None"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "x is not shorthand so is invalid",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "VWX"
},
"expected": "None"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "too short is invalid",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "AU"
},
"expected": "None"
},
{
"uuid": "ecafab60-89f2-4680-9286-56b423e8a7b9",
"description": "too long is invalid",
"comments": [
"The original design of the exercise deviates from problem-specifications",
"by having a name_for function for individual codons.",
"Upstreaming is impossible as it would change the design of the exercise.",
"Omitting them would leave the function untested, which would be confusing."
],
"property": "name_for",
"input": {
"name": "ATTA"
},
"expected": "None"
}
]
76 changes: 76 additions & 0 deletions exercises/practice/protein-translation/.meta/test_template.tera
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
use protein_translation::*;

{% for test in cases %}
{# custom name_for tests are first, of_rna is supposed to build on it #}
{% if test.property != "name_for" %}{% continue %}{% endif %}
#[test]
#[ignore]
fn {{ test.description | snake_case }}() {
let info = parse(make_pairs());
assert_eq!(info.name_for({{ test.input.name | json_encode() }}), {{ test.expected }});
}
{% endfor -%}

{% for test in cases %}
{% if test.property != "proteins" %}{% continue %}{% endif %}
#[test]
#[ignore]
fn {{ test.description | snake_case }}() {
let info = parse(make_pairs());
assert_eq!(
info.of_rna({{ test.input.strand | json_encode() }}),
{% if test.expected is object %}
None
{% else %}
Some(vec![
{% for s in test.expected %}
"{{ s | lower }}" {% if not loop.last %} , {% endif %}
{% endfor %}
])
{% endif %},
);
}
{% endfor -%}

// The input data constructor. Returns a list of codon, name pairs.
fn make_pairs() -> Vec<(&'static str, &'static str)> {
let grouped = vec![
("isoleucine", vec!["AUU", "AUC", "AUA"]),
("valine", vec!["GUU", "GUC", "GUA", "GUG"]),
("phenylalanine", vec!["UUU", "UUC"]),
("methionine", vec!["AUG"]),
("cysteine", vec!["UGU", "UGC"]),
("alanine", vec!["GCU", "GCC", "GCA", "GCG"]),
("glycine", vec!["GGU", "GGC", "GGA", "GGG"]),
("proline", vec!["CCU", "CCC", "CCA", "CCG"]),
("threonine", vec!["ACU", "ACC", "ACA", "ACG"]),
("serine", vec!["UCU", "UCC", "UCA", "UCG"]),
("tyrosine", vec!["UAU", "UAC"]),
("tryptophan", vec!["UGG"]),
("glutamine", vec!["CAA", "CAG"]),
("asparagine", vec!["AAU", "AAC"]),
("histidine", vec!["CAU", "CAC"]),
("glutamic acid", vec!["GAA", "GAG"]),
("aspartic acid", vec!["GAU", "GAC"]),
{#
("lysine", vec!["AAA", "AAG"]),
Lysine is not listed in the canonical description
and there are no tests for it.
Unfortunately, problem-specifications has a test against
"invalid" codons, where "AAA" is the invalid input.
This technically maps to lysine, so we have to exclude it here
to pass the test from upstream.
#}
("arginine", vec!["CGU", "CGC", "CGA", "CGG", "AGA", "AGG"]),
("leucine", vec!["UUA", "UUG"]),
("stop codon", vec!["UAA", "UAG", "UGA"]),
];
let mut pairs = Vec::<(&'static str, &'static str)>::new();
for (name, codons) in grouped.into_iter() {
for codon in codons {
pairs.push((codon, name));
}
}
pairs.sort_by(|&(_, a), &(_, b)| a.cmp(b));
pairs
}
103 changes: 100 additions & 3 deletions exercises/practice/protein-translation/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,100 @@
# 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.

[2c44f7bf-ba20-43f7-a3bf-f2219c0c3f98]
description = "Empty RNA sequence results in no proteins"

[96d3d44f-34a2-4db4-84cd-fff523e069be]
description = "Methionine RNA sequence"

[1b4c56d8-d69f-44eb-be0e-7b17546143d9]
description = "Phenylalanine RNA sequence 1"

[81b53646-bd57-4732-b2cb-6b1880e36d11]
description = "Phenylalanine RNA sequence 2"

[42f69d4f-19d2-4d2c-a8b0-f0ae9ee1b6b4]
description = "Leucine RNA sequence 1"

[ac5edadd-08ed-40a3-b2b9-d82bb50424c4]
description = "Leucine RNA sequence 2"

[8bc36e22-f984-44c3-9f6b-ee5d4e73f120]
description = "Serine RNA sequence 1"

[5c3fa5da-4268-44e5-9f4b-f016ccf90131]
description = "Serine RNA sequence 2"

[00579891-b594-42b4-96dc-7ff8bf519606]
description = "Serine RNA sequence 3"

[08c61c3b-fa34-4950-8c4a-133945570ef6]
description = "Serine RNA sequence 4"

[54e1e7d8-63c0-456d-91d2-062c72f8eef5]
description = "Tyrosine RNA sequence 1"

[47bcfba2-9d72-46ad-bbce-22f7666b7eb1]
description = "Tyrosine RNA sequence 2"

[3a691829-fe72-43a7-8c8e-1bd083163f72]
description = "Cysteine RNA sequence 1"

[1b6f8a26-ca2f-43b8-8262-3ee446021767]
description = "Cysteine RNA sequence 2"

[1e91c1eb-02c0-48a0-9e35-168ad0cb5f39]
description = "Tryptophan RNA sequence"

[e547af0b-aeab-49c7-9f13-801773a73557]
description = "STOP codon RNA sequence 1"

[67640947-ff02-4f23-a2ef-816f8a2ba72e]
description = "STOP codon RNA sequence 2"

[9c2ad527-ebc9-4ace-808b-2b6447cb54cb]
description = "STOP codon RNA sequence 3"

[f4d9d8ee-00a8-47bf-a1e3-1641d4428e54]
description = "Sequence of two protein codons translates into proteins"

[dd22eef3-b4f1-4ad6-bb0b-27093c090a9d]
description = "Sequence of two different protein codons translates into proteins"

[d0f295df-fb70-425c-946c-ec2ec185388e]
description = "Translate RNA strand into correct protein list"

[e30e8505-97ec-4e5f-a73e-5726a1faa1f4]
description = "Translation stops if STOP codon at beginning of sequence"

[5358a20b-6f4c-4893-bce4-f929001710f3]
description = "Translation stops if STOP codon at end of two-codon sequence"

[ba16703a-1a55-482f-bb07-b21eef5093a3]
description = "Translation stops if STOP codon at end of three-codon sequence"

[4089bb5a-d5b4-4e71-b79e-b8d1f14a2911]
description = "Translation stops if STOP codon in middle of three-codon sequence"

[2c2a2a60-401f-4a80-b977-e0715b23b93d]
description = "Translation stops if STOP codon in middle of six-codon sequence"

[1e75ea2a-f907-4994-ae5c-118632a1cb0f]
description = "Non-existing codon can't translate"

[9eac93f3-627a-4c90-8653-6d0a0595bc6f]
description = "Unknown amino acids, not part of a codon, can't translate"

[9d73899f-e68e-4291-b1e2-7bf87c00f024]
description = "Incomplete RNA sequence can't translate"

[43945cf7-9968-402d-ab9f-b8a28750b050]
description = "Incomplete RNA sequence can translate if valid until a STOP codon"
Loading

0 comments on commit 962ce99

Please sign in to comment.