#include "pch.h"

#define protected public
#define private public

#include "../QRCodeLibrary/QRMatrix.hpp"

TEST(QRMatrixTests, CreatesMatrixOfAppropriateSize) {
	QRMatrix m(4);

	EXPECT_EQ(m.c.size(), 37);
}

TEST(QRMatrixTests, DrawsFinderSquare) {
	QRMatrix m(0);

	m.draw_finder_square(0, 0);
	EXPECT_EQ(m.to_string(), "1111111EEEEEEEEEEEEEE\n1000001EEEEEEEEEEEEEE\n1011101EEEEEEEEEEEEEE\n1011101EEEEEEEEEEEEEE\n1011101EEEEEEEEEEEEEE\n1000001EEEEEEEEEEEEEE\n1111111EEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE");

	m.draw_finder_square(7, 7);
	EXPECT_EQ(m.to_string(), "1111111EEEEEEEEEEEEEE\n1000001EEEEEEEEEEEEEE\n1011101EEEEEEEEEEEEEE\n1011101EEEEEEEEEEEEEE\n1011101EEEEEEEEEEEEEE\n1000001EEEEEEEEEEEEEE\n1111111EEEEEEEEEEEEEE\nEEEEEEE1111111EEEEEEE\nEEEEEEE1000001EEEEEEE\nEEEEEEE1011101EEEEEEE\nEEEEEEE1011101EEEEEEE\nEEEEEEE1011101EEEEEEE\nEEEEEEE1000001EEEEEEE\nEEEEEEE1111111EEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE");

	m.draw_finder_square(1, 1);
	EXPECT_EQ(m.to_string(), "1111111EEEEEEEEEEEEEE\n11111111EEEEEEEEEEEEE\n11000001EEEEEEEEEEEEE\n11011101EEEEEEEEEEEEE\n11011101EEEEEEEEEEEEE\n11011101EEEEEEEEEEEEE\n11000001EEEEEEEEEEEEE\nE1111111111111EEEEEEE\nEEEEEEE1000001EEEEEEE\nEEEEEEE1011101EEEEEEE\nEEEEEEE1011101EEEEEEE\nEEEEEEE1011101EEEEEEE\nEEEEEEE1000001EEEEEEE\nEEEEEEE1111111EEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE");
}

TEST(QRMatrixTests, DrawsFinderPatterns) {
	QRMatrix m(0);

	m.draw_finder_patterns();

	EXPECT_EQ(m.to_string(), "11111110EEEEE01111111\n10000010EEEEE01000001\n10111010EEEEE01011101\n10111010EEEEE01011101\n10111010EEEEE01011101\n10000010EEEEE01000001\n11111110EEEEE01111111\n00000000EEEEE00000000\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\nEEEEEEEEEEEEEEEEEEEEE\n00000000EEEEEEEEEEEEE\n11111110EEEEEEEEEEEEE\n10000010EEEEEEEEEEEEE\n10111010EEEEEEEEEEEEE\n10111010EEEEEEEEEEEEE\n10111010EEEEEEEEEEEEE\n10000010EEEEEEEEEEEEE\n11111110EEEEEEEEEEEEE");
}

TEST(QRMatrixTests, DrawsPatterns) {
	BitArray tmp(441);
	QRMatrix m(1);

	m.draw_patterns();

	EXPECT_EQ(m.to_ascii(), "####### EEEEEEEEE #######\n#     # EEEEEEEEE #     #\n# ### # EEEEEEEEE # ### #\n# ### # EEEEEEEEE # ### #\n# ### # EEEEEEEEE # ### #\n#     # EEEEEEEEE #     #\n####### # # # # # #######\n        EEEEEEEEE        \nEEEEEE#EEEEEEEEEEEEEEEEEE\nEEEEEE EEEEEEEEEEEEEEEEEE\nEEEEEE#EEEEEEEEEEEEEEEEEE\nEEEEEE EEEEEEEEEEEEEEEEEE\nEEEEEE#EEEEEEEEEEEEEEEEEE\nEEEEEE EEEEEEEEEEEEEEEEEE\nEEEEEE#EEEEEEEEEEEEEEEEEE\nEEEEEE EEEEEEEEEEEEEEEEEE\nEEEEEE#EEEEEEEEE#####EEEE\n        #EEEEEEE#   #EEEE\n####### EEEEEEEE# # #EEEE\n#     # EEEEEEEE#   #EEEE\n# ### # EEEEEEEE#####EEEE\n# ### # EEEEEEEEEEEEEEEEE\n# ### # EEEEEEEEEEEEEEEEE\n#     # EEEEEEEEEEEEEEEEE\n####### EEEEEEEEEEEEEEEEE");

	m.place_data(tmp, 0);

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