#!/bin/sh
set -e

WORKDIR=$(mktemp -d)
trap 'rm -rf "$WORKDIR"' 0 INT QUIT ABRT PIPE TERM
cd "$WORKDIR"

cat > roundtrip.cpp <<'EOF'
#include <kff_io.hpp>
#include <cstdint>
#include <cstring>
#include <iostream>

static void encode(const char *seq, uint8_t *packed)
{
  for (size_t i = 0; seq[i]; ++i) {
    uint8_t c = seq[i] == 'A' ? 0 : seq[i] == 'C' ? 1 : seq[i] == 'G' ? 3 : 2;
    packed[i / 4] |= c << (6 - 2 * (i % 4));
  }
}

int main()
{
  const char *path = "roundtrip.kff";
  uint8_t packed[2] = {0, 0};
  uint8_t data[5] = {1, 2, 3, 4, 5};
  encode("ACGTACGT", packed);

  {
    Kff_file file(path, "w");
    file.write_encoding(0, 1, 3, 2);
    const char *meta = "autopkgtest";
    file.write_metadata(strlen(meta), (const uint8_t *)meta);
    Section_GV gv(&file);
    gv.write_var("k", 4);
    gv.write_var("max", 8);
    gv.write_var("data_size", 1);
    gv.close();
    Section_Raw sr(&file);
    sr.write_compacted_sequence(packed, 8, data);
    sr.close();
    file.close();
  }

  {
    Kff_file file(path, "r");
    Section_GV gv(&file);
    if (file.global_vars["k"] != 4) return 1;
    uint8_t seq[2] = {0, 0}, got[5] = {0};
    Section_Raw sr(&file);
    if (sr.read_compacted_sequence(seq, got) != 5) return 2;
    if (memcmp(seq, packed, 2) != 0) return 3;
    if (memcmp(got, data, 5) != 0) return 4;
    file.close();
  }

  {
    Kff_reader reader(path);
    int n = 0;
    while (reader.has_next()) {
      uint8_t *kmer, *dat;
      reader.next_kmer(kmer, dat);
      ++n;
    }
    if (n != 5) return 5;
  }

  std::cout << "OK" << std::endl;
  return 0;
}
EOF

g++ -std=c++14 -Wall -o roundtrip roundtrip.cpp -lkff
./roundtrip | grep -qx OK
