001    package calhoun.seq.test;
002    
003    import java.util.Map;
004    
005    import calhoun.seq.RepeatedSubsequence;
006    import calhoun.util.AbstractTestCase;
007    
008    public class RepeatedSubsequenceTest extends AbstractTestCase  {
009            public void testRepeatedSubsequence() {
010                    assertEquals("ATGC", RepeatedSubsequence.calc("ATGC"));
011                    assertEquals("A", RepeatedSubsequence.calc("AA"));
012                    assertEquals("A", RepeatedSubsequence.calc("AAA"));
013                    assertEquals("A", RepeatedSubsequence.calc("AAAA"));
014                    assertEquals("A", RepeatedSubsequence.calc("AAAAA"));
015                    assertEquals("A", RepeatedSubsequence.calc("AAAAAA"));
016                    assertEquals("AT", RepeatedSubsequence.calc("ATATATATAT"));
017                    assertEquals("ATATCG", RepeatedSubsequence.calc("ATATCGATATCG"));
018                    assertEquals("AT", RepeatedSubsequence.calc("ATATATATATAT"));
019            }
020            
021            public void testRollingMatch() {
022                    assertEquals(true, RepeatedSubsequence.isRollingMatch("ATGC", "ATGC"));
023                    assertEquals(true, RepeatedSubsequence.isRollingMatch("CATG", "ATGC"));
024                    assertEquals(true, RepeatedSubsequence.isRollingMatch("GCAT", "ATGC"));
025                    assertEquals(true, RepeatedSubsequence.isRollingMatch("TGCA", "ATGC"));
026                    assertEquals(false, RepeatedSubsequence.isRollingMatch("TCGA", "ATGC"));
027            }
028    
029            private String getCanonical(Map<String, Integer> m, String seq) {
030                    // Get the smallest repeated subsequence from this sequence
031                    seq = RepeatedSubsequence.calc(seq);
032    
033                    // Check this subseqeunce vs. all others to see if we have a rolling match.
034                    for(String key : m.keySet()) {
035                            if(RepeatedSubsequence.isRollingMatch(key, seq)) {
036                                    m.put(key, m.get(key) + 1);
037                                    return key;
038                            }
039                    }
040    
041                    // If no match, add it into the map
042                    m.put(seq, 1);
043                    return seq;
044            }
045    }