package org.molgenis.gavin.job.input;
import com.google.common.collect.ImmutableMultiset;
import com.google.common.collect.Multiset;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.molgenis.gavin.job.input.model.CaddVariant;
import org.molgenis.gavin.job.input.model.LineType;
import org.molgenis.gavin.job.input.model.Variant;
import org.molgenis.gavin.job.input.model.VcfVariant;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.List;
import static org.mockito.Mockito.verify;
import static org.molgenis.gavin.job.input.model.LineType.*;
public class ParserTest
{
private Parser lineParser = new Parser();
@Mock
private LineSink output;
@Mock
private LineSink error;
@BeforeMethod
private void beforeMethod()
{
MockitoAnnotations.initMocks(this);
}
@DataProvider(name = "chrom")
public Object[][] createParseChromTestcases()
{
return new Object[][] { { "X", "X" }, { "chr1", "1" }, { "2", "2" }, { "3", "3" }, { "4", "4" }, { "5", "5" },
{ "6", "6" }, { "7", "7" }, { "8", "8" }, { "9", "9" }, { "10", "10" }, { "11", "11" }, { "12", "12" },
{ "13", "13" }, { "14", "14" }, { "15", "15" }, { "16", "16" }, { "17", "17" }, { "18", "18" },
{ "19", "19" }, { "20", "20" }, { "21", "21" }, { "22", "22" }, { "chr22", "22" }, { "CHR-X", null },
{ "chrx", "X" }, { "MT", null }, { "0", null }, { "01", null }, { "23", null }, { "chrY", "Y" } };
}
@Test(dataProvider = "chrom")
public void testParseChrom(String input, String expected)
{
Assert.assertEquals(lineParser.parseChrom(input), expected);
}
@DataProvider(name = "line")
public Object[][] createParseVariantTestcases()
{
return new Object[][] { { "X\t123\tA\tC", null },
{ "X\t123\t.\tA\tC", VcfVariant.create("X", 123, ".", "A", "C") },
{ "20\t14370\trs6054257\tG\tA\t29\tPASS\tNS=3;DP=14;AF=0.5;DB;H2\tGT:GQ:DP:HQ",
VcfVariant.create("20", 14370, "rs6054257", "G", "A") },
{ "20\t14370\t.\tG\tA\t29\tPASS\tNS=3;DP=14;AF=0.5;DB;H2\tGT:GQ:DP:HQ",
VcfVariant.create("20", 14370, ".", "G", "A") }, { "", null },
{ "X\t123\tA\tC\t213.23\tblah", null }, { "X\t123\tA\tC\t213.23", null },
{ " X \t 123 \t rsblah \t A \t C \t 213.23", VcfVariant.create("X", 123, "rsblah", "A", "C") },
{ "20\t14370\tG\t.\t2.2\t3.234", CaddVariant.create("20", 14370, "G", ".", 2.2, 3.234) },
{ "X\t123\t\tA\tC\t213.23", VcfVariant.create("X", 123, ".", "A", "C") } };
}
@Test(dataProvider = "line")
public void testParseVariant(String input, Variant expected)
{
Assert.assertEquals(lineParser.tryParseVariant(input), expected);
}
@Test
public void testTransform()
{
List<String> lines = Arrays
.asList("#Comment line", "#Another comment line", "11\t47359281\t.\tC\tG\t.\t.\tCADD_SCALED=33.0",
"11\t47359281\tC\tCC\t2.3\t33.0", "11\t47359281\t.\tC\tCG\t.\t.\tCADD_SCALED=33.0",
"11\t47359281\t.\tCG\tC\t.\t.\tCADD_SCALED=33.0");
Multiset<LineType> expected = ImmutableMultiset.of(COMMENT, COMMENT, VCF, CADD, INDEL_NOCADD, INDEL_NOCADD);
Assert.assertEquals(lineParser.transformLines(lines.stream(), output, error), expected);
verify(output).accept("##fileformat=VCFv4.0");
verify(output).accept("#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO");
verify(output).accept("11\t47359281\t.\tC\tG\t.\t.\t.");
verify(output).accept("11\t47359281\t.\tC\tCC\t.\t.\tCADD=2.3;CADD_SCALED=33.0");
verify(error).accept("Line 5:\t11\t47359281\t.\tC\tCG\t.\t.\tCADD_SCALED=33.0");
verify(error).accept("Line 6:\t11\t47359281\t.\tCG\tC\t.\t.\tCADD_SCALED=33.0");
}
@Test
public void testTransformSkipsLinesWhenMaxLinesProcessed()
{
Assert.assertEquals(lineParser.transformLine("", 120000, 100000, output, error), LineType.SKIPPED);
Mockito.verifyZeroInteractions(output, error);
}
}