`define ACE	7'b0001000
`define TWO	7'b0100100
`define THREE	7'b0110000
`define FOUR	7'b0011001
`define FIVE	7'b0010010
`define SIX	7'b0000010
`define SEVEN	7'b1111000
`define EIGHT	7'b0000000
`define NINE	7'b0010000
`define TEN	7'b1000000
`define JACK	7'b1100001
`define QUEEN	7'b0011000
`define KING	7'b0001001
`define BLANK	7'b1111111

module tb_task4();
	logic err, resetb, slow_clock, CLOCK_50;
	logic [3:0] KEY;
	logic [6:0] HEX0, HEX1, HEX2, HEX3, HEX4, HEX5;
	logic [9:0] LEDR;

	assign KEY[0] = slow_clock;
	assign KEY[3] = resetb;

	task5 DUT(CLOCK_50, KEY, LEDR, HEX5, HEX4, HEX3, HEX2, HEX1, HEX0);

	task check;
		input logic [6:0] expected_HEX0, expected_HEX1, expected_HEX2,
			expected_HEX3, expected_HEX4, expected_HEX5;
		input logic [9:0] expected_LEDR;

		if (HEX0 !== expected_HEX0) begin
			err = 1;
			$display("FAILED: HEX0 is incorrect.",);
		end
		if (HEX1 !== expected_HEX1) begin
			err = 1;
			$display("FAILED: HEX1 is incorrect.",);
		end
		if (HEX2 !== expected_HEX2) begin
			err = 1;
			$display("FAILED: HEX2 is incorrect.",);
		end
		if (HEX3 !== expected_HEX3) begin
			err = 1;
			$display("FAILED: HEX3 is incorrect.",);
		end
		if (HEX4 !== expected_HEX4) begin
			err = 1;
			$display("FAILED: HEX4 is incorrect.",);
		end
		if (HEX5 !== expected_HEX5) begin
			err = 1;
			$display("FAILED: HEX5 is incorrect.",);
		end
		if (LEDR !== expected_LEDR) begin
			err = 1;
			$display("FAILED: LEDR is incorrect.",);
		end
	endtask: check

	initial forever begin
		slow_clock = 1'b0;
		#5;
		slow_clock = 1'b1;
		#5;
	end

	initial begin
		err = 0;

		/* Reset. */

		$display("Test 1");

		resetb = 1'b0;

		#10;

		resetb = 1'b1;

		check(`BLANK, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK, 10'b00_0000_0000);

		/* Test for natural win. Player: 9T, dealer: A2. */

		$display("Test 2.1");

		force tb_task5.DUT.dp.new_card = 4'd9;

		#10;

		check(`NINE, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK, 10'b00_0000_1001);

		$display("Test 2.2");

		force tb_task5.DUT.dp.new_card = 4'd1;

		#10;

		check(`NINE, `BLANK, `BLANK, `ACE, `BLANK, `BLANK, 10'b00_0001_1001);

		$display("Test 2.3");

		force tb_task5.DUT.dp.new_card = 4'd10;

		#10;

		check(`NINE, `TEN, `BLANK, `ACE, `BLANK, `BLANK, 10'b00_0001_1001);

		$display("Test 2.4");

		force tb_task5.DUT.dp.new_card = 4'd2;

		#10;

		check(`NINE, `TEN, `BLANK, `ACE, `TWO, `BLANK, 10'b00_0011_1001);

		$display("Test 2.5");

		/* Load anything. */
		force tb_task5.DUT.dp.new_card = 4'd10;

		#10;

		check(`NINE, `TEN, `BLANK, `ACE, `TWO, `BLANK, 10'b01_0011_1001);

		$display("Test 2.6");

		resetb = 1'b0;

		#10;

		resetb = 1'b1;

		check(`BLANK, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK, 10'b00_0000_0000);

		if (~err)
			$display("All tests passed.");

		#10;
		$stop;
	end
endmodule: tb_task4
