#include <prjxray/segbits_file_reader.h>

#include <map>
#include <string>

#include <gtest/gtest.h>

TEST(SegbitsFileReaderTest, NonExistantFileReturnsNull) {
	EXPECT_FALSE(
	    prjxray::SegbitsFileReader::InitWithFile("does_not_exist"));
}

TEST(SegbitsFileReaderTest, ZeroLengthFileYieldsNoItems) {
	auto segbits_reader =
	    prjxray::SegbitsFileReader::InitWithFile("empty_file");
	ASSERT_TRUE(segbits_reader);

	EXPECT_EQ(segbits_reader->begin(), segbits_reader->end());
}

TEST(SegbitsFileReaderTest, FileWithOneEntry) {
	auto segbits_reader =
	    prjxray::SegbitsFileReader::InitWithFile("one_entry.segbits");
	ASSERT_TRUE(segbits_reader);

	auto begin_iter = segbits_reader->begin();
	EXPECT_EQ(begin_iter->tag(), "CLBLL_L.SLICEL_X0.A5FF.ZINI");
	EXPECT_EQ(begin_iter->bit(), "31_06");

	EXPECT_EQ(++begin_iter, segbits_reader->end());
}

TEST(SegbitsFileReaderTest, FileWithOneEntryWithEmptyTag) {
	auto segbits_reader = prjxray::SegbitsFileReader::InitWithFile(
	    "one_entry_empty_tag.segbits");
	ASSERT_TRUE(segbits_reader);

	auto begin_iter = segbits_reader->begin();
	EXPECT_EQ(begin_iter->tag(), "");
	EXPECT_EQ(begin_iter->bit(), "31_06");

	EXPECT_EQ(++begin_iter, segbits_reader->end());
}

TEST(SegbitsFileReaderTest, FileWithOneEntryMissingBit) {
	auto segbits_reader = prjxray::SegbitsFileReader::InitWithFile(
	    "one_entry_missing_bit.segbits");
	ASSERT_TRUE(segbits_reader);

	auto begin_iter = segbits_reader->begin();
	EXPECT_EQ(begin_iter->tag(), "CLBLL_L.SLICEL_X0.A5FF.ZINI");
	EXPECT_EQ(begin_iter->bit(), "");

	EXPECT_EQ(++begin_iter, segbits_reader->end());
}

TEST(SegbitsFileReaderTest, FileWithOneEntryWithExtraWhitespace) {
	auto segbits_reader = prjxray::SegbitsFileReader::InitWithFile(
	    "one_entry_extra_whitespace.segbits");
	ASSERT_TRUE(segbits_reader);

	auto begin_iter = segbits_reader->begin();
	EXPECT_EQ(begin_iter->tag(), "CLBLL_L.SLICEL_X0.A5FF.ZINI");
	EXPECT_EQ(begin_iter->bit(), "31_06");

	EXPECT_EQ(++begin_iter, segbits_reader->end());
}

TEST(SegbitsFileReaderTest, FileWithTwoEntries) {
	auto segbits_reader =
	    prjxray::SegbitsFileReader::InitWithFile("two_entries.segbits");
	ASSERT_TRUE(segbits_reader);

	auto iter = segbits_reader->begin();
	EXPECT_EQ(iter->tag(), "CLBLL_L.SLICEL_X0.A5FF.ZINI");
	EXPECT_EQ(iter->bit(), "31_06");

	++iter;
	EXPECT_EQ(iter->tag(), "CLBLL_L.SLICEL_X0.AFF.ZINI");
	EXPECT_EQ(iter->bit(), "31_03");

	EXPECT_EQ(++iter, segbits_reader->end());
}
