add Mussa::save_motif()
[mussa.git] / alg / test / test_mussa.cpp
index 74f3c20b2a543f1f0d14b9a92aad49da3aa30b1b..cfa873515c7234d3ffbd8646c7d8be9db9ceb6c4 100644 (file)
@@ -180,7 +180,7 @@ BOOST_AUTO_TEST_CASE( mussa_load_analysis )
 BOOST_AUTO_TEST_CASE( mussa_load_motif )
 {
   string data = "AAGG 1.0 1.0 0.0\n"
-                "GGTT 0.0 0.1 1.0\n";
+                "GGTT 0.0 0.1 1.0 1.0\n";
 
   istringstream test_istream(data);
 
@@ -243,6 +243,74 @@ BOOST_AUTO_TEST_CASE( mussa_weirdly_spaced_named_motif )
   BOOST_REQUIRE_EQUAL(motifs.size(), 1);
   BOOST_CHECK_EQUAL(motifs.begin()->get_name(), "cat_meow123");
 }
+
+BOOST_AUTO_TEST_CASE( mussa_name_quoted_motif )
+{
+  string data = "CCAATT       \"cat meow 123\"     0.1    0.2 0.3\n";
+  istringstream test_istream(data);
+
+  Mussa m1;
+  m1.append_sequence("AAAAGGGGTTTT");
+  m1.append_sequence("GGGCCCCTTCCAATT");
+  m1.load_motifs(test_istream);
+
+  std::set<Sequence> motifs = m1.motifs();
+  BOOST_REQUIRE_EQUAL(motifs.size(), 1);
+  BOOST_CHECK_EQUAL(motifs.begin()->get_name(), "cat meow 123");
+}
+
+BOOST_AUTO_TEST_CASE( mussa_name_embedded_quote_motif )
+{
+  // pretty obviously this shouldn't work as " are our delimiter
+  // and i'm too lazy to add support for \ in the parser
+  string data = "ATA 0.5 0.5 0.5\n"
+                "CCAATT       \"cat \"meow 123\"     0.1    0.2 0.3\n";
+  istringstream test_istream(data);
+
+  Mussa m1;
+  m1.append_sequence("AAAAGGGGTTTT");
+  m1.append_sequence("GGGCCCCTTCCAATT");
+  BOOST_CHECK_THROW( m1.load_motifs(test_istream), motif_load_error);
+
+  std::set<Sequence> motifs = m1.motifs();
+  BOOST_REQUIRE_EQUAL(motifs.size(), 0);
+}
+
+BOOST_AUTO_TEST_CASE( mussa_save_motif )
+{
+  string data = "ATA 1 1 1 1\n"
+                "CAT \"my name\" 1 0 0.5 0.5\n";
+  istringstream data_istream(data);
+
+  Mussa m1;
+  m1.append_sequence("AAAAGGGGTTTT");
+  m1.append_sequence("GGGCCCCTTCCAATT");
+  m1.load_motifs(data_istream);
+  
+  string save;
+  ostringstream save_ostream(save);
+  m1.save_motifs(save_ostream);
+
+  istringstream reloaded_istream(save_ostream.str());
+  Mussa m2;
+  m2.append_sequence("AAAAGGGGTTTT");
+  m2.append_sequence("GGGCCCCTTCCAATT");
+  m2.load_motifs(reloaded_istream);
+  
+  BOOST_REQUIRE_EQUAL(m1.motifs().size(), m2.motifs().size());
+  Mussa::motif_set::const_iterator m1motif = m1.motifs().begin();
+  Mussa::motif_set::const_iterator m2motif = m2.motifs().begin();
+  for (;
+       m1motif != m1.motifs().end() and m2motif != m2.motifs().end();
+       ++m1motif, ++m2motif) 
+  {
+    BOOST_CHECK_EQUAL(m1motif->get_sequence(), m2motif->get_sequence());
+    BOOST_CHECK_EQUAL(m1motif->get_name(), m2motif->get_name());
+    BOOST_CHECK_EQUAL(m1.colorMapper()->lookup("motif", m1motif->get_sequence()),
+                      m2.colorMapper()->lookup("motif", m2motif->get_sequence()));
+  }  
+}
+
 BOOST_AUTO_TEST_CASE( mussa_add_motif )
 {
   vector<Sequence> motifs;