public static void testReaderWriter(
      final VariantContextIOTest tester,
      final VCFHeader header,
      final List<VariantContext> expected,
      final Iterable<VariantContext> vcs,
      final boolean recurse)
      throws IOException {
    final File tmpFile = File.createTempFile("testReaderWriter", tester.getExtension());
    tmpFile.deleteOnExit();

    // write expected to disk
    final EnumSet<Options> options = EnumSet.of(Options.INDEX_ON_THE_FLY);
    final VariantContextWriter writer = tester.makeWriter(tmpFile, options);
    writeVCsToFile(writer, header, vcs);

    // ensure writing of expected == actual
    final VariantContextContainer p = tester.readAllVCs(tmpFile);
    final Iterable<VariantContext> actual = p.getVCs();
    assertEquals(actual, expected);

    if (recurse) {
      // if we are doing a recursive test, grab a fresh iterator over the written values
      final Iterable<VariantContext> read = tester.readAllVCs(tmpFile).getVCs();
      testReaderWriter(tester, p.getHeader(), expected, read, false);
    }
  }
  private static void makeEmpiricalTests() throws IOException {
    if (ENABLE_SOURCE_VCF_TESTS) {
      for (final File file : testSourceVCFs) {
        VCFCodec codec = new VCFCodec();
        VariantContextContainer x = readAllVCs(file, codec);
        List<VariantContext> fullyDecoded = new ArrayList<VariantContext>();

        for (final VariantContext raw : x.getVCs()) {
          if (raw != null) fullyDecoded.add(raw.fullyDecode(x.getHeader(), false));
        }

        TEST_DATAs.add(new VariantContextTestData(x.getHeader(), fullyDecoded));
      }
    }
  }
  public static void testReaderWriterWithMissingGenotypes(
      final VariantContextIOTest tester, final VariantContextTestData data) throws IOException {
    final int nSamples = data.header.getNGenotypeSamples();
    if (nSamples > 2) {
      for (final VariantContext vc : data.vcs)
        if (vc.isSymbolic())
          // cannot handle symbolic alleles because they may be weird non-call VCFs
          return;

      final File tmpFile = File.createTempFile("testReaderWriter", tester.getExtension());
      tmpFile.deleteOnExit();

      // write expected to disk
      final EnumSet<Options> options = EnumSet.of(Options.INDEX_ON_THE_FLY);
      final VariantContextWriter writer = tester.makeWriter(tmpFile, options);

      final Set<String> samplesInVCF = new HashSet<String>(data.header.getGenotypeSamples());
      final List<String> missingSamples = Arrays.asList("MISSING1", "MISSING2");
      final List<String> allSamples = new ArrayList<String>(missingSamples);
      allSamples.addAll(samplesInVCF);

      final VCFHeader header = new VCFHeader(data.header.getMetaDataInInputOrder(), allSamples);
      writeVCsToFile(writer, header, data.vcs);

      // ensure writing of expected == actual
      final VariantContextContainer p = tester.readAllVCs(tmpFile);
      final Iterable<VariantContext> actual = p.getVCs();

      int i = 0;
      for (final VariantContext readVC : actual) {
        if (readVC == null) continue; // sometimes we read null records...
        final VariantContext expected = data.vcs.get(i++);
        for (final Genotype g : readVC.getGenotypes()) {
          Assert.assertTrue(allSamples.contains(g.getSampleName()));
          if (samplesInVCF.contains(g.getSampleName())) {
            assertEquals(g, expected.getGenotype(g.getSampleName()));
          } else {
            // missing
            Assert.assertTrue(g.isNoCall());
          }
        }
      }
    }
  }
 public static void assertVCFandBCFFilesAreTheSame(final File vcfFile, final File bcfFile)
     throws IOException {
   final VariantContextContainer vcfData = readAllVCs(vcfFile, new VCFCodec());
   final VariantContextContainer bcfData = readAllVCs(bcfFile, new BCF2Codec());
   assertEquals(bcfData.getHeader(), vcfData.getHeader());
   assertEquals(bcfData.getVCs(), vcfData.getVCs());
 }