#include "pch.h"

#define protected public
#define private public

#include "../QRCodeLibrary/TritMatrix.hpp"

TEST(TritMatrixTests, CreatesVectorOfVectors) {
	TritMatrix m(5, 4);

	ASSERT_EQ(m.c.size(), 4);

	for (int i = 0; i < 4; i++)
		EXPECT_EQ(m.c[i].size(), 5);
}

TEST(TritMatrixTests, GetsByCoordinates) {
	TritMatrix m(5, 4);

	m.c[1][4] = Trit::F;

	EXPECT_EQ(m.get(1, 4), Trit::F);
	EXPECT_EQ(m.get(1, 3), Trit::EMPTY);
}

TEST(TritMatrixTests, SetsIndividualCell) {
	TritMatrix m(5, 4);

	m.set(1, 3, Trit::T);

	EXPECT_EQ(m.get(1, 3), Trit::T);
	EXPECT_EQ(m.get(1, 4), Trit::EMPTY);

	m.set(1, 4, Trit::F);

	EXPECT_EQ(m.get(1, 3), Trit::T);
	EXPECT_EQ(m.get(1, 4), Trit::F);
}

TEST(TritMatrixTests, SetsIndividualCellWithBool) {
	TritMatrix m(5, 4);

	m.set(1, 3, 1);

	EXPECT_EQ(m.get(1, 3), Trit::T);
	EXPECT_EQ(m.get(1, 4), Trit::EMPTY);

	m.set(1, 4, 0);

	EXPECT_EQ(m.get(1, 3), Trit::T);
	EXPECT_EQ(m.get(1, 4), Trit::F);
}

TEST(TritMatrixTests, ConvertsToString) {
	TritMatrix m(2, 2);

	m.set(0, 0, 1);
	m.set(1, 0, 0);
	m.set(1, 1, 1);

	EXPECT_EQ(m.to_string(), "1E\n01");
}

TEST(TritMatrixTests, SetsMultipleCells) {
	TritMatrix m(5, 4);

	m.set(1, 1, 0b101, 3);

	ASSERT_EQ(m.to_string(), "EEEEE\nE101E\nEEEEE\nEEEEE");

	m.set(2, 0, 0b11111, 5);

	ASSERT_EQ(m.to_string(), "EEEEE\nE101E\n11111\nEEEEE");

	m.set(2, 1, 0b010, 3);

	EXPECT_EQ(m.to_string(), "EEEEE\nE101E\n10101\nEEEEE");
}

TEST(TritMatrixTests, ConvertsToASCII) {
	TritMatrix m(2, 2);

	m.set(0, 0, 0b10, 2);
	m.set(1, 0, 0b01, 2);

	EXPECT_EQ(m.to_ascii(), "# \n #");
}