def test_add(self): c = pc.ProgramCaller(config_std) c_alt = pc.ProgramCaller(config_alt) c.Add(c_alt) self.assertEqual(len(c.msa), 5) self.assertEqual(len(c.tree), 5) for x in "mafft mergealign muscle another_msa bad_method".split(): self.assertTrue(x in c.msa) for x in "fasttree raxml iqtree false_method raxml_no_path".split(): self.assertTrue(x in c.tree)
def test_GetMSAMethodCommand(self): workingDir = "/home/david/WorkingDir/" c = pc.ProgramCaller(config_std) # test a method that uses the proposed output filename cmd, outfn = c.GetMSAMethodCommand("mafft", workingDir + "OG234.fa", workingDir + "Alignments/OG234.fa", "OG234_id") self.assertEqual( cmd, "mafft --localpair --maxiterate 1000 --anysymbol /home/david/WorkingDir/OG234.fa > /home/david/WorkingDir/Alignments/OG234.fa 2> /dev/null" ) cmd, outfn = c.GetMSAMethodCommand("mafft", workingDir + "OGXYZ.fa", workingDir + "Alignments/OGXXX.fa", "OGYYY_id") self.assertEqual( cmd, "mafft --localpair --maxiterate 1000 --anysymbol /home/david/WorkingDir/OGXYZ.fa > /home/david/WorkingDir/Alignments/OGXXX.fa 2> /dev/null" ) # test a method that generates its own output filename based on unique ID - don't actually test what the real output filename is here - need to run it for that cmd, outfn = c.GetMSAMethodCommand("mergealign", workingDir + "OG234.fa", workingDir + "Alignments/OG234.fa", "OG234_id") self.assertEqual( cmd, "python /home/david/software/MergeAlign/run_mergealign.py /home/david/WorkingDir/OG234.fa" )
def test_CallTreeMethod(self): c = pc.ProgramCaller(config_alt) # Write an input file infn = output_dir + "Test.fa" with open(infn, 'wb') as outfile: outfile.write(">a1\nST\n>b2\nKL\n>c3\nSL\n>d4\nKT") # test a method that uses the proposed output filename exp_outfn = output_dir + "OG234.tre" if os.path.exists(exp_outfn): os.remove(exp_outfn) outfn = c.CallTreeMethod("fasttree", infn, exp_outfn, "OGabc_id") self.assertTrue(outfn != None) self.assertEqual(outfn, exp_outfn) expectedTree = "(a1:1.10312,c3:0.00055,(b2:0.00055,d4:1.46340)0.761:1.41871);" with open(outfn, 'rb') as infile: tree = infile.read().rstrip() self.assertEqual(expectedTree, tree) # test a method that generates its own output filename based on unique ID exp_outfn = output_dir + "OG234_id.treefile" if os.path.exists(exp_outfn): os.remove(exp_outfn) outfn = c.CallTreeMethod("iqtree", infn, output_dir + "OG234.tre", "OG234_id") self.assertEqual(outfn, exp_outfn) # with open(outfn, 'rb') as infile: tree = infile.read().rstrip() expectedTree = ete2.Tree( "(a1:0.7475350209,(b2:0.0000026604,c3:1.2318876921):1.279964,d4:0.0000022111);" ) actualTree = ete2.Tree(outfn) for n in expectedTree: x = (actualTree & n.name).dist self.assertLess( abs(x - n.dist) / n.dist, 0.3, (n.dist, (actualTree & n.name).dist))
def test_CallMSAMethod(self): c = pc.ProgramCaller(config_alt) # Write an input file infn = output_dir + "Test.fa" with open(infn, 'wb') as outfile: outfile.write(">a1\nST\n>b2\nKL\n>c3\nSL\n>d4\nKT\n") # test a method that uses the proposed output filename exp_outfn = output_dir + "OG234.fa" if os.path.exists(exp_outfn): os.remove(exp_outfn) outfn = c.CallMSAMethod("mafft", infn, exp_outfn, "OGabc_id") self.assertTrue(outfn != None) self.assertEqual(outfn, exp_outfn) self.assertTrue(filecmp.cmp( infn, outfn)) # Alignment should be same as input # test a method that generates its own output filename based on input filename exp_outfn = output_dir + "MergeAlign_alignment_Test.fa" if os.path.exists(exp_outfn): os.remove(outfn) outfn = c.CallMSAMethod("mergealign", infn, output_dir + "Alignments/OG234.fa", "OG234_id") self.assertEqual(outfn, exp_outfn) self.assertTrue( filecmp.cmp( baseDir + "ExpectedOutput/ProgramCaller/MergeAlign_alignment_Test.fa", outfn))
def test_space(self): with captured_output() as (out, err): c = pc.ProgramCaller(config_space) self.assertTrue(len(c.msa) == 1) self.assertTrue("mergealign" in c.msa) self.assertFalse("maf ft" in c.msa) output = out.getvalue().strip() expected_out = """WARNING: Incorrecty formatted configuration file entry: maf ft\nNo space is allowed in name: 'maf ft'""" self.assertEqual(output, expected_out) error = err.getvalue().strip() self.assertEqual(error, "")
def test_malformatted_json(self): with captured_output() as (out, err): c = pc.ProgramCaller(config_bad_json) self.assertTrue(len(c.msa) == 0) self.assertTrue(len(c.tree) == 0) output = out.getvalue().strip() expected_out = """WARNING: Incorrecty formatted configuration file /home/david/workspace/git/OrthoFinder/Tests/Input/ConfigFiles/configure_bad_json.json File is not in .json format. No user-confgurable multiple sequence alignment or tree inference methods have been added.""" self.assertEqual(output, expected_out) error = err.getvalue().strip() self.assertEqual(error, "")
def test_TestTreeMethod(self): c = pc.ProgramCaller(config_alt) # test a method that won't work self.assertFalse(c.TestTreeMethod(output_dir, "false_method")) # test a method that ses the proposed output filename self.assertTrue(c.TestTreeMethod(output_dir, "fasttree")) # test a method that generates its own output filename based on unique ID self.assertTrue(c.TestTreeMethod(output_dir, "iqtree")) self.assertRaises(Exception, c.TestTreeMethod, output_dir, "made_up") # test a program not in path self.assertFalse(c.TestTreeMethod(output_dir, "raxml_no_path"))
def test_normal_construct(self): c = pc.ProgramCaller(config_std) methods_msa = "mafft mergealign muscle another_msa".split() methods_trees = "fasttree raxml iqtree".split() msa = c.ListMSAMethods() self.assertEqual(len(msa), len(methods_msa)) for m in methods_msa: self.assertTrue(m in msa, m) trees = c.ListTreeMethods() self.assertEqual(len(trees), len(methods_trees)) for m in methods_trees: self.assertTrue(m in trees, m) c = pc.ProgramCaller(config_alt) methods_msa = "mafft mergealign bad_method".split() methods_trees = "fasttree iqtree false_method raxml_no_path".split() msa = c.ListMSAMethods() self.assertEqual(len(msa), len(methods_msa)) for m in methods_msa: self.assertTrue(m in msa, m) trees = c.ListTreeMethods() self.assertEqual(len(trees), len(methods_trees)) for m in methods_trees: self.assertTrue(m in trees, m)