|
| 1 | +import LeanTest |
| 2 | +import ProteinTranslation |
| 3 | + |
| 4 | +open LeanTest |
| 5 | + |
| 6 | +instance {α β} [BEq α] [BEq β] : BEq (Except α β) where |
| 7 | + beq |
| 8 | + | .ok a, .ok b => a == b |
| 9 | + | .error e1, .error e2 => e1 == e2 |
| 10 | + | _, _ => false |
| 11 | + |
| 12 | +def proteinTranslationTests : TestSuite := |
| 13 | + (TestSuite.empty "ProteinTranslation") |
| 14 | + |>.addTest "Empty RNA sequence results in no proteins" (do |
| 15 | + return assertEqual (.ok #[]) (ProteinTranslation.proteins "")) |
| 16 | + |>.addTest "Methionine RNA sequence" (do |
| 17 | + return assertEqual (.ok #[.Methionine]) (ProteinTranslation.proteins "AUG")) |
| 18 | + |>.addTest "Phenylalanine RNA sequence 1" (do |
| 19 | + return assertEqual (.ok #[.Phenylalanine]) (ProteinTranslation.proteins "UUU")) |
| 20 | + |>.addTest "Phenylalanine RNA sequence 2" (do |
| 21 | + return assertEqual (.ok #[.Phenylalanine]) (ProteinTranslation.proteins "UUC")) |
| 22 | + |>.addTest "Leucine RNA sequence 1" (do |
| 23 | + return assertEqual (.ok #[.Leucine]) (ProteinTranslation.proteins "UUA")) |
| 24 | + |>.addTest "Leucine RNA sequence 2" (do |
| 25 | + return assertEqual (.ok #[.Leucine]) (ProteinTranslation.proteins "UUG")) |
| 26 | + |>.addTest "Serine RNA sequence 1" (do |
| 27 | + return assertEqual (.ok #[.Serine]) (ProteinTranslation.proteins "UCU")) |
| 28 | + |>.addTest "Serine RNA sequence 2" (do |
| 29 | + return assertEqual (.ok #[.Serine]) (ProteinTranslation.proteins "UCC")) |
| 30 | + |>.addTest "Serine RNA sequence 3" (do |
| 31 | + return assertEqual (.ok #[.Serine]) (ProteinTranslation.proteins "UCA")) |
| 32 | + |>.addTest "Serine RNA sequence 4" (do |
| 33 | + return assertEqual (.ok #[.Serine]) (ProteinTranslation.proteins "UCG")) |
| 34 | + |>.addTest "Tyrosine RNA sequence 1" (do |
| 35 | + return assertEqual (.ok #[.Tyrosine]) (ProteinTranslation.proteins "UAU")) |
| 36 | + |>.addTest "Tyrosine RNA sequence 2" (do |
| 37 | + return assertEqual (.ok #[.Tyrosine]) (ProteinTranslation.proteins "UAC")) |
| 38 | + |>.addTest "Cysteine RNA sequence 1" (do |
| 39 | + return assertEqual (.ok #[.Cysteine]) (ProteinTranslation.proteins "UGU")) |
| 40 | + |>.addTest "Cysteine RNA sequence 2" (do |
| 41 | + return assertEqual (.ok #[.Cysteine]) (ProteinTranslation.proteins "UGC")) |
| 42 | + |>.addTest "Tryptophan RNA sequence" (do |
| 43 | + return assertEqual (.ok #[.Tryptophan]) (ProteinTranslation.proteins "UGG")) |
| 44 | + |>.addTest "STOP codon RNA sequence 1" (do |
| 45 | + return assertEqual (.ok #[]) (ProteinTranslation.proteins "UAA")) |
| 46 | + |>.addTest "STOP codon RNA sequence 2" (do |
| 47 | + return assertEqual (.ok #[]) (ProteinTranslation.proteins "UAG")) |
| 48 | + |>.addTest "STOP codon RNA sequence 3" (do |
| 49 | + return assertEqual (.ok #[]) (ProteinTranslation.proteins "UGA")) |
| 50 | + |>.addTest "Sequence of two protein codons translates into proteins" (do |
| 51 | + return assertEqual (.ok #[.Phenylalanine, .Phenylalanine]) (ProteinTranslation.proteins "UUUUUU")) |
| 52 | + |>.addTest "Sequence of two different protein codons translates into proteins" (do |
| 53 | + return assertEqual (.ok #[.Leucine, .Leucine]) (ProteinTranslation.proteins "UUAUUG")) |
| 54 | + |>.addTest "Translate RNA strand into correct protein list" (do |
| 55 | + return assertEqual (.ok #[.Methionine, .Phenylalanine, .Tryptophan]) (ProteinTranslation.proteins "AUGUUUUGG")) |
| 56 | + |>.addTest "Translation stops if STOP codon at beginning of sequence" (do |
| 57 | + return assertEqual (.ok #[]) (ProteinTranslation.proteins "UAGUGG")) |
| 58 | + |>.addTest "Translation stops if STOP codon at end of two-codon sequence" (do |
| 59 | + return assertEqual (.ok #[.Tryptophan]) (ProteinTranslation.proteins "UGGUAG")) |
| 60 | + |>.addTest "Translation stops if STOP codon at end of three-codon sequence" (do |
| 61 | + return assertEqual (.ok #[.Methionine, .Phenylalanine]) (ProteinTranslation.proteins "AUGUUUUAA")) |
| 62 | + |>.addTest "Translation stops if STOP codon in middle of three-codon sequence" (do |
| 63 | + return assertEqual (.ok #[.Tryptophan]) (ProteinTranslation.proteins "UGGUAGUGG")) |
| 64 | + |>.addTest "Translation stops if STOP codon in middle of six-codon sequence" (do |
| 65 | + return assertEqual (.ok #[.Tryptophan, .Cysteine, .Tyrosine]) (ProteinTranslation.proteins "UGGUGUUAUUAAUGGUUU")) |
| 66 | + |>.addTest "Sequence of two non-STOP codons does not translate to a STOP codon" (do |
| 67 | + return assertEqual (.ok #[.Methionine, .Methionine]) (ProteinTranslation.proteins "AUGAUG")) |
| 68 | + |>.addTest "Unknown amino acids, not part of a codon, can't translate" (do |
| 69 | + return assertEqual (.error "Invalid codon") (ProteinTranslation.proteins "XYZ")) |
| 70 | + |>.addTest "Incomplete RNA sequence can't translate" (do |
| 71 | + return assertEqual (.error "Invalid codon") (ProteinTranslation.proteins "AUGU")) |
| 72 | + |>.addTest "Incomplete RNA sequence can translate if valid until a STOP codon" (do |
| 73 | + return assertEqual (.ok #[.Phenylalanine, .Phenylalanine]) (ProteinTranslation.proteins "UUCUUCUAAUGGU")) |
| 74 | + |
| 75 | +def main : IO UInt32 := do |
| 76 | + runTestSuitesWithExitCode [proteinTranslationTests] |
0 commit comments