From 58ba0ff557df2fe100e447adde06b960dd309c0c Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Mon, 1 Jan 2024 14:27:37 -0300 Subject: [PATCH 1/4] Sync tests for practice exercise protein translation --- .../protein-translation/.meta/tests.toml | 34 ++++++++++-- .../src/test/java/ProteinTranslatorTest.java | 52 ++++++++++++++++++- 2 files changed, 81 insertions(+), 5 deletions(-) diff --git a/exercises/practice/protein-translation/.meta/tests.toml b/exercises/practice/protein-translation/.meta/tests.toml index 02a54c344..5fb189070 100644 --- a/exercises/practice/protein-translation/.meta/tests.toml +++ b/exercises/practice/protein-translation/.meta/tests.toml @@ -1,6 +1,16 @@ -# 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" @@ -53,6 +63,12 @@ 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" @@ -70,3 +86,15 @@ 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" diff --git a/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java b/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java index 4a184d365..55867d0c7 100644 --- a/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java +++ b/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; public class ProteinTranslatorTest { @@ -118,7 +119,7 @@ public void testStopRnaSequence3() { @Test public void testTranslationOfRnaToProteinList() { assertThat(proteinTranslator.translate("AUGUUUUGG")) - .containsExactly("Methionine", "Phenylalanine", "Tryptophan"); + .containsExactly("Methionine", "Phenylalanine", "Tryptophan"); } @Ignore("Remove to run test") @@ -149,7 +150,54 @@ public void testTranslationStopsIfStopCodonInMiddle1() { @Test public void testTranslationStopsIfStopCodonInMiddle2() { assertThat(proteinTranslator.translate("UGGUGUUAUUAAUGGUUU")) - .containsExactly("Tryptophan", "Cysteine", "Tyrosine"); + .containsExactly("Tryptophan", "Cysteine", "Tyrosine"); } + @Ignore("Remove to run test") + @Test + public void testEmptyRnaSequenceResultInNoproteins() { + assertThat(proteinTranslator.translate("")).isEmpty(); + } + + @Ignore("Remove to run test") + @Test + public void testSequenceOfTwoProteinCodonsTranslatesIntoProteins() { + assertThat(proteinTranslator.translate("UUUUUU")).containsExactly("Phenylalanine", "Phenylalanine"); + } + + @Ignore("Remove to run test") + @Test + public void testSequenceOfTwoDifferentProteinCodonsTranslatesIntoProteins() { + assertThat(proteinTranslator.translate("UUAUUG")).containsExactly("Leucine", "Leucine"); + } + + @Ignore("Remove to run test") + @Test + public void testIncompleteRnaSequenceCanTranslateIfValidUntilAStopCodon() { + assertThat(proteinTranslator.translate("UUCUUCUAAUGGU")).containsExactly("Phenylalanine", "Phenylalanine"); + } + + @Ignore("Remove to run test") + @Test + public void testNonExistingCodonCantTranslate() { + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> proteinTranslator.translate("AAA")) + .withMessage("Invalid codon"); + } + + @Ignore("Remove to run test") + @Test + public void testUnknownAminoAcidsNotPartOfACodonCantTranslate() { + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> proteinTranslator.translate("XYZ")) + .withMessage("Invalid codon"); + } + + @Ignore("Remove to run test") + @Test + public void testIncompleteRnaSequenceCantTranslate() { + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> proteinTranslator.translate("AUGU")) + .withMessage("Invalid codon"); + } } From 37fa0b82b313615d8da94616173152d0126ec06f Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Mon, 1 Jan 2024 15:27:53 -0300 Subject: [PATCH 2/4] Updating reference resolution and updating tests order to match canonical data --- .../src/reference/java/ProteinTranslator.java | 66 ++++++++++--------- .../src/test/java/ProteinTranslatorTest.java | 47 +++++++------ 2 files changed, 58 insertions(+), 55 deletions(-) diff --git a/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java b/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java index 1179f2c0b..31b112f1c 100644 --- a/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java +++ b/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java @@ -1,45 +1,49 @@ -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; class ProteinTranslator { - private static final String[] METHIONINE = {"AUG"}; - private static final String[] PHENYLALANINE = {"UUU", "UUC"}; - private static final String[] LEUCINE = {"UUA", "UUG"}; - private static final String[] SERINE = {"UCU", "UCC", "UCA", "UCG"}; - private static final String[] TYROSINE = {"UAU", "UAC"}; - private static final String[] CYSTEINE = {"UGU", "UGC"}; - private static final String[] TRYPTOPHAN = {"UGG"}; - private static final String[] STOP = {"UAA", "UAG", "UGA"}; + private final static Map aminoAcidsMap = new HashMap<>() { + { + put("AUG", "Methionine"); + put("UUU", "Phenylalanine"); + put("UUC", "Phenylalanine"); + put("UUA", "Leucine"); + put("UUG", "Leucine"); + put("UCU", "Serine"); + put("UCC", "Serine"); + put("UCA", "Serine"); + put("UCG", "Serine"); + put("UAU", "Tyrosine"); + put("UAC", "Tyrosine"); + put("UGU", "Cysteine"); + put("UGC", "Cysteine"); + put("UGG", "Tryptophan"); + put("UAA", "STOP"); + put("UAG", "STOP"); + put("UGA", "STOP"); + } + }; List translate(String rnaSequence) { + List proteinList = new ArrayList<>(); - List proteinList = new ArrayList(); + if (rnaSequence.length() % 3 != 0 && (!rnaSequence.contains("UAA") || !rnaSequence.contains("UAG") || !rnaSequence.contains("UGA"))) + throw new IllegalArgumentException("Invalid codon"); for (int i = 0; i < rnaSequence.length(); i += 3) { - String codon = rnaSequence.substring(i, i + 3); - - if (Arrays.asList(METHIONINE).contains(codon)) { - proteinList.add("Methionine"); - } else if (Arrays.asList(PHENYLALANINE).contains(codon)) { - proteinList.add("Phenylalanine"); - } else if (Arrays.asList(LEUCINE).contains(codon)) { - proteinList.add("Leucine"); - } else if (Arrays.asList(SERINE).contains(codon)) { - proteinList.add("Serine"); - } else if (Arrays.asList(TYROSINE).contains(codon)) { - proteinList.add("Tyrosine"); - } else if (Arrays.asList(CYSTEINE).contains(codon)) { - proteinList.add("Cysteine"); - } else if (Arrays.asList(TRYPTOPHAN).contains(codon)) { - proteinList.add("Tryptophan"); - } else if (Arrays.asList(STOP).contains(codon)) { - break; + String currentSequence = rnaSequence.substring(i, i + 3); + + if (aminoAcidsMap.get(currentSequence).equals("STOP")) + return proteinList; + + if (aminoAcidsMap.containsKey(currentSequence)) { + proteinList.add(aminoAcidsMap.get(currentSequence)); } else { - throw new IllegalArgumentException("Invalid input"); + throw new IllegalArgumentException("Invalid codon"); } - } return proteinList; diff --git a/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java b/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java index 55867d0c7..fbec63213 100644 --- a/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java +++ b/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java @@ -13,6 +13,11 @@ public class ProteinTranslatorTest { public void setUp() { proteinTranslator = new ProteinTranslator(); } + + @Test + public void testEmptyRnaSequenceResultInNoproteins() { + assertThat(proteinTranslator.translate("")).isEmpty(); + } @Test public void testMethionineRnaSequence() { @@ -114,6 +119,18 @@ public void testStopRnaSequence2() { public void testStopRnaSequence3() { assertThat(proteinTranslator.translate("UGA")).isEmpty(); } + + @Ignore("Remove to run test") + @Test + public void testSequenceOfTwoProteinCodonsTranslatesIntoProteins() { + assertThat(proteinTranslator.translate("UUUUUU")).containsExactly("Phenylalanine", "Phenylalanine"); + } + + @Ignore("Remove to run test") + @Test + public void testSequenceOfTwoDifferentProteinCodonsTranslatesIntoProteins() { + assertThat(proteinTranslator.translate("UUAUUG")).containsExactly("Leucine", "Leucine"); + } @Ignore("Remove to run test") @Test @@ -153,30 +170,6 @@ public void testTranslationStopsIfStopCodonInMiddle2() { .containsExactly("Tryptophan", "Cysteine", "Tyrosine"); } - @Ignore("Remove to run test") - @Test - public void testEmptyRnaSequenceResultInNoproteins() { - assertThat(proteinTranslator.translate("")).isEmpty(); - } - - @Ignore("Remove to run test") - @Test - public void testSequenceOfTwoProteinCodonsTranslatesIntoProteins() { - assertThat(proteinTranslator.translate("UUUUUU")).containsExactly("Phenylalanine", "Phenylalanine"); - } - - @Ignore("Remove to run test") - @Test - public void testSequenceOfTwoDifferentProteinCodonsTranslatesIntoProteins() { - assertThat(proteinTranslator.translate("UUAUUG")).containsExactly("Leucine", "Leucine"); - } - - @Ignore("Remove to run test") - @Test - public void testIncompleteRnaSequenceCanTranslateIfValidUntilAStopCodon() { - assertThat(proteinTranslator.translate("UUCUUCUAAUGGU")).containsExactly("Phenylalanine", "Phenylalanine"); - } - @Ignore("Remove to run test") @Test public void testNonExistingCodonCantTranslate() { @@ -200,4 +193,10 @@ public void testIncompleteRnaSequenceCantTranslate() { .isThrownBy(() -> proteinTranslator.translate("AUGU")) .withMessage("Invalid codon"); } + + @Ignore("Remove to run test") + @Test + public void testIncompleteRnaSequenceCanTranslateIfValidUntilAStopCodon() { + assertThat(proteinTranslator.translate("UUCUUCUAAUGGU")).containsExactly("Phenylalanine", "Phenylalanine"); + } } From 9729025560325b2f3b13cb2f9f6f4cecfec4437d Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Mon, 1 Jan 2024 16:00:32 -0300 Subject: [PATCH 3/4] Fixing lint issues and fixing code to pass the tests --- .../.meta/src/reference/java/ProteinTranslator.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java b/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java index 31b112f1c..1eb328b69 100644 --- a/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java +++ b/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java @@ -5,7 +5,7 @@ class ProteinTranslator { - private final static Map aminoAcidsMap = new HashMap<>() { + private final Map aminoAcidsMap = new HashMap<>() { { put("AUG", "Methionine"); put("UUU", "Phenylalanine"); @@ -30,14 +30,16 @@ class ProteinTranslator { List translate(String rnaSequence) { List proteinList = new ArrayList<>(); - if (rnaSequence.length() % 3 != 0 && (!rnaSequence.contains("UAA") || !rnaSequence.contains("UAG") || !rnaSequence.contains("UGA"))) + if (rnaSequence.length() % 3 != 0 && !(rnaSequence.contains("UAA") || rnaSequence.contains("UAG") || rnaSequence.contains("UGA"))) { throw new IllegalArgumentException("Invalid codon"); + } for (int i = 0; i < rnaSequence.length(); i += 3) { String currentSequence = rnaSequence.substring(i, i + 3); - if (aminoAcidsMap.get(currentSequence).equals("STOP")) + if (aminoAcidsMap.get(currentSequence).equals("STOP")) { return proteinList; + } if (aminoAcidsMap.containsKey(currentSequence)) { proteinList.add(aminoAcidsMap.get(currentSequence)); From e776a039ac1adc5052fe2bd245401b007bf6bd6c Mon Sep 17 00:00:00 2001 From: manumafe98 Date: Mon, 1 Jan 2024 16:26:44 -0300 Subject: [PATCH 4/4] Fixing lint issue on line 33 and updating if statement to check if the key exist first due to null pointer exception --- .../.meta/src/reference/java/ProteinTranslator.java | 11 ++++++----- .../src/test/java/ProteinTranslatorTest.java | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java b/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java index 1eb328b69..60ca9d0d7 100644 --- a/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java +++ b/exercises/practice/protein-translation/.meta/src/reference/java/ProteinTranslator.java @@ -30,18 +30,19 @@ class ProteinTranslator { List translate(String rnaSequence) { List proteinList = new ArrayList<>(); - if (rnaSequence.length() % 3 != 0 && !(rnaSequence.contains("UAA") || rnaSequence.contains("UAG") || rnaSequence.contains("UGA"))) { + if (rnaSequence.length() % 3 != 0 + && !(rnaSequence.contains("UAA") || rnaSequence.contains("UAG") || rnaSequence.contains("UGA"))) { throw new IllegalArgumentException("Invalid codon"); } for (int i = 0; i < rnaSequence.length(); i += 3) { String currentSequence = rnaSequence.substring(i, i + 3); - if (aminoAcidsMap.get(currentSequence).equals("STOP")) { - return proteinList; - } - if (aminoAcidsMap.containsKey(currentSequence)) { + if (aminoAcidsMap.get(currentSequence).equals("STOP")) { + return proteinList; + } + proteinList.add(aminoAcidsMap.get(currentSequence)); } else { throw new IllegalArgumentException("Invalid codon"); diff --git a/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java b/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java index fbec63213..76c493b58 100644 --- a/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java +++ b/exercises/practice/protein-translation/src/test/java/ProteinTranslatorTest.java @@ -13,12 +13,13 @@ public class ProteinTranslatorTest { public void setUp() { proteinTranslator = new ProteinTranslator(); } - + @Test public void testEmptyRnaSequenceResultInNoproteins() { assertThat(proteinTranslator.translate("")).isEmpty(); } + @Ignore("Remove to run test") @Test public void testMethionineRnaSequence() { assertThat(proteinTranslator.translate("AUG")).containsExactly("Methionine"); @@ -119,12 +120,12 @@ public void testStopRnaSequence2() { public void testStopRnaSequence3() { assertThat(proteinTranslator.translate("UGA")).isEmpty(); } - + @Ignore("Remove to run test") @Test public void testSequenceOfTwoProteinCodonsTranslatesIntoProteins() { assertThat(proteinTranslator.translate("UUUUUU")).containsExactly("Phenylalanine", "Phenylalanine"); - } + } @Ignore("Remove to run test") @Test @@ -193,10 +194,10 @@ public void testIncompleteRnaSequenceCantTranslate() { .isThrownBy(() -> proteinTranslator.translate("AUGU")) .withMessage("Invalid codon"); } - + @Ignore("Remove to run test") @Test public void testIncompleteRnaSequenceCanTranslateIfValidUntilAStopCodon() { assertThat(proteinTranslator.translate("UUCUUCUAAUGGU")).containsExactly("Phenylalanine", "Phenylalanine"); - } + } }