MIPS-Simulator / virtual_machine_gui_test.cpp
virtual_machine_gui_test.cpp
Raw
#include <QTest>
#include <QPlainTextEdit>
#include <QTableView>
#include <QLineEdit>
#include <QPushButton>
#include <QDebug>
#include <QStandardItemModel>

#include "virtual_machine_gui.hpp"

#include "test_config.hpp"

class VirtualMachineGUITest : public QObject {
	Q_OBJECT

private slots:

	void initTestCase();
 
  // TODO: implement additional tests here
	void test01();
	void test02();
	void test03();
	void test04();
	void test05();
	void test06();
	void test07();
	void test08();
	void test09();
	void test10();
	void test11();
	void test12();
	void test13();
	void test14();
	void test15();
	void test16();
	void test17();
	void test18();
	void test19();
	void test20();

	void test21();

private:
	VirtualMachineGUI widget;
  
};

// this section just verifies the object names and API
void VirtualMachineGUITest::initTestCase(){

  widget.load(QString::fromStdString(TEST_FILE_DIR + "/vm/test00.asm"));

  auto textWidget = widget.findChild<QPlainTextEdit *>("text");
  QVERIFY2(textWidget, "Could not find QPLainText widget");

  auto registerViewWidget = widget.findChild<QTableView *>("registers");
  QVERIFY2(registerViewWidget, "Could not find QTableView widget for registers");

  auto memoryViewWidget = widget.findChild<QTableView *>("memory");
  QVERIFY2(memoryViewWidget, "Could not find QTableView widget for memory");

  auto statusViewWidget = widget.findChild<QLineEdit *>("status");
  QVERIFY2(statusViewWidget, "Could not find QLineEdit widget for status");

  auto stepButtonWidget = widget.findChild<QPushButton *>("step");
  QVERIFY2(stepButtonWidget, "Could not find QTableView widget for memory");

  auto runButtonWidget = widget.findChild<QPushButton *>("run");
  QVERIFY2(runButtonWidget, "Could not find QTableView widget for memory");

  auto breakButtonWidget = widget.findChild<QPushButton *>("break");
  QVERIFY2(breakButtonWidget, "Could not find QTableView widget for memory");
}

void VirtualMachineGUITest::test01() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test01.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	QVERIFY2(textWidget, "Could not find QPLainText widget");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	QVERIFY2(registerViewWidget, "Could not find QTableView widget for registers");
	auto memoryViewWidget = widget.findChild<QTableView*>("memory");
	QVERIFY2(memoryViewWidget, "Could not find QTableView widget for memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	QVERIFY2(statusViewWidget, "Could not find QLineEdit widget for status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");
	QVERIFY2(stepButtonWidget, "Could not find QTableView widget for memory");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Wrong status str");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Wrong");

	str = modelM->data(modelM->index(8, 1)).toString();
	QVERIFY2(str == "0x01", "Memory Wrong");
	str = modelM->data(modelM->index(9, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Wrong");
	str = modelM->data(modelM->index(10, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Wrong");
	str = modelM->data(modelM->index(11, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Wrong");
	str = modelM->data(modelM->index(12, 1)).toString();
	QVERIFY2(str == "0xfe", "Memory Wrong");
	str = modelM->data(modelM->index(13, 1)).toString();
	QVERIFY2(str == "0xff", "Memory Wrong");
	str = modelM->data(modelM->index(14, 1)).toString();
	QVERIFY2(str == "0xff", "Memory Wrong");
	str = modelM->data(modelM->index(15, 1)).toString();
	QVERIFY2(str == "0xff", "Memory Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000001", "Program Counter Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000008", "Register Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000002", "Program Counter Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000003", "Program Counter Wrong");
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000001", "Register Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000004", "Program Counter Wrong");
	str = modelR->data(modelR->index(11 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffe", "Register Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000005", "Program Counter Wrong");
	str = modelR->data(modelR->index(12 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffe", "Register Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000006", "Program Counter Wrong");
	str = modelR->data(modelR->index(13 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffe", "Program Counter Wrong");

}

void VirtualMachineGUITest::test02() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test02.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView*>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	qDebug() << "PC = " << str;
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000001", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000002", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000007", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000003", "Program Counter Value Wrong");
	str = modelM->data(modelM->index(0, 1)).toString();
	QVERIFY2(str == "0x07", "Memory Value Wrong");
	str = modelM->data(modelM->index(1, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(2, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(3, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000004", "Program Counter Value Wrong");
	str = modelM->data(modelM->index(4, 1)).toString();
	QVERIFY2(str == "0x07", "Memory Value Wrong");
	str = modelM->data(modelM->index(5, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(6, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(7, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000005", "Program Counter Value Wrong");
	str = modelM->data(modelM->index(8, 1)).toString();
	QVERIFY2(str == "0x07", "Memory Value Wrong");
	str = modelM->data(modelM->index(9, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(10, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(11, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000006", "Program Counter Value Wrong");
	str = modelM->data(modelM->index(12, 1)).toString();
	QVERIFY2(str == "0x07", "Memory Value Wrong");
	str = modelM->data(modelM->index(13, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(14, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(15, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000007", "Program Counter Value Wrong");
	str = modelM->data(modelM->index(16, 1)).toString();
	QVERIFY2(str == "0x07", "Memory Value Wrong");
	str = modelM->data(modelM->index(17, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(18, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(19, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
}

void VirtualMachineGUITest::test03() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test03.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000001", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000064", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000001", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(11 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000002", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(12 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000004", "Program Counter Value Wrong");

}

void VirtualMachineGUITest::test04() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test04.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");


	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000001", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffb2e", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");
	str = modelR->data(modelR->index(14 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");
	str = modelR->data(modelR->index(15 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffb2e", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffb2e", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(11 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffb2e", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(12 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffb2e", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(13 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffb2e", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(14 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffb2e", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(15 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffb2e", "Register Value Wrong");

}

void VirtualMachineGUITest::test05() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test05.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000003", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000001", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000001", "Register Value Wrong");
}

void VirtualMachineGUITest::test06() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test06.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000003", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x0000001f", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x0000002b", "Register Value Wrong");
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0x0000004a", "Register Value Wrong");
}

void VirtualMachineGUITest::test07() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test07.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000003", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000001", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x0000000c", "Register Value Wrong");
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0xffffffff", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000006", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(11 + regIndex, 2)).toString();
	QVERIFY2(str == "0xffffffff", "Register Value Wrong");
	str = modelR->data(modelR->index(12 + regIndex, 2)).toString();
	QVERIFY2(str == "0x0000000b", "Register Value Wrong");
	str = modelR->data(modelR->index(13 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffd", "Register Value Wrong");

}

void VirtualMachineGUITest::test08() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test08.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000003", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000001", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x0000000c", "Register Value Wrong");
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0xffffffff", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000006", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(11 + regIndex, 2)).toString();
	QVERIFY2(str == "0xffffffff", "Register Value Wrong");
	str = modelR->data(modelR->index(12 + regIndex, 2)).toString();
	QVERIFY2(str == "0x0000000b", "Register Value Wrong");
	str = modelR->data(modelR->index(13 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffd", "Register Value Wrong");
}

void VirtualMachineGUITest::test09() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test09.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000005", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000002", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0x00000008", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0x00000000", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000008", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x0000000a", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffe", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000002", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0xfffffffc", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0xffffffff", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffc", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0xffffffff", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x0000000f", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x40000000", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0x00000000", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0x00000001", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000001", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000014", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x40000000", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffc", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0x00000000", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0xffffffff", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0xffffffff", "Register Value Wrong");

}

void VirtualMachineGUITest::test10() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test10.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000005", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000002", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0x00000008", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0x00000000", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000008", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x0000000a", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x40000000", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0x00000000", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0x00000001", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000001", "Register Value Wrong");
}

void VirtualMachineGUITest::test11() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test11.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000005", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000002", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0x00000000", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0x00000002", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000002", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x0000000a", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffe", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000002", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0xffffffff", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0x00000000", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0xffffffff", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x0000000f", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x40000000", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0x10000000", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0x00000000", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0x10000000", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000014", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x40000000", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffc", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0xf0000000", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0x00000000", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0xf0000000", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");

}

void VirtualMachineGUITest::test12() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test12.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000005", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000002", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0x00000000", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0x00000002", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000002", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x0000000a", "Program Counter Value Wrong");
	str = modelR->data(modelR->index(8 + regIndex, 2)).toString();
	QVERIFY2(str == "0x40000001", "Register Value Wrong");
	str = modelR->data(modelR->index(9 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");
	str = modelR->data(modelR->index(2, 2)).toString(); // lo
	QVERIFY2(str == "0x10000000", "Wrong register $lo str");
	str = modelR->data(modelR->index(1, 2)).toString(); // hi
	QVERIFY2(str == "0x00000001", "Wrong register $hi str");
	str = modelR->data(modelR->index(24 + regIndex, 2)).toString();
	QVERIFY2(str == "0x10000000", "Register Value Wrong");
	str = modelR->data(modelR->index(25 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000001", "Register Value Wrong");

	/*stepButtonWidget->click();
	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");*/

}

void VirtualMachineGUITest::test13() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test13.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000008", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");
}

void VirtualMachineGUITest::test14() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test14.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffff1", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffff0", "Register Value Wrong");
}

void VirtualMachineGUITest::test15() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test15.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0x0000000e", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0x0000000f", "Register Value Wrong");
}

void VirtualMachineGUITest::test16() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test16.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0x00000006", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0x0000000f", "Register Value Wrong");
}

void VirtualMachineGUITest::test17() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test17.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffff3", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffff5", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(10 + regIndex, 2)).toString();
	QVERIFY2(str == "0xfffffffc", "Register Value Wrong");
}

void VirtualMachineGUITest::test18() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test18.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	// int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString(); \
		QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000001", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000003", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000000", "Register Value Wrong");
}

void VirtualMachineGUITest::test19() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test19.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView *>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	// int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString(); \
		QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000004", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000005", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000007", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000008", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x0000000a", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x0000000b", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x0000000d", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x0000000e", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000010", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000011", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000013", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000014", "Register Value Wrong");

	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000016", "Register Value Wrong");

	stepButtonWidget->click();
	stepButtonWidget->click();
	str = modelR->data(modelR->index(0, 2)).toString();
	QVERIFY2(str == "0x00000016", "Register Value Wrong");
}

void VirtualMachineGUITest::test20() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test20.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView*>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	// int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString(); \
		QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	for (int i = 0; i < 54; i++) {
		stepButtonWidget->click();
	}

	str = modelM->data(modelM->index(4, 1)).toString();
	QVERIFY2(str == "0x81", "Memory Value Wrong");
	str = modelM->data(modelM->index(5, 1)).toString();
	QVERIFY2(str == "0x01", "Memory Value Wrong");
	str = modelM->data(modelM->index(6, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(7, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");

}

void VirtualMachineGUITest::test21() {
	QString file = QString::fromStdString(TEST_FILE_DIR + "/vm/test20.asm");
	widget.load(file);

	auto textWidget = widget.findChild<QPlainTextEdit*>("text");
	auto registerViewWidget = widget.findChild<QTableView*>("registers");
	auto memoryViewWidget = widget.findChild<QTableView*>("memory");
	auto statusViewWidget = widget.findChild<QLineEdit*>("status");
	auto stepButtonWidget = widget.findChild<QPushButton*>("step");
	auto runButtonWidget = widget.findChild<QPushButton*>("run");
	auto breakButtonWidget = widget.findChild<QPushButton*>("break");

	auto modelR = registerViewWidget->model();
	auto modelM = memoryViewWidget->model();
	QString str;
	// int regIndex = 3;

	QVERIFY2(statusViewWidget->text() == "Ok", "Status Wrong");
	// test program counter value
	str = modelR->data(modelR->index(0, 2)).toString(); 
	QVERIFY2(str == "0x00000000", "Program Counter Value Wrong");

	runButtonWidget->click();
	QTest::qSleep(1000);
	breakButtonWidget->click();

	str = modelM->data(modelM->index(4, 1)).toString();
	QVERIFY2(str == "0x81", "Memory Value Wrong");
	str = modelM->data(modelM->index(5, 1)).toString();
	QVERIFY2(str == "0x01", "Memory Value Wrong");
	str = modelM->data(modelM->index(6, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");
	str = modelM->data(modelM->index(7, 1)).toString();
	QVERIFY2(str == "0x00", "Memory Value Wrong");

	

}

QTEST_MAIN(VirtualMachineGUITest)
#include "virtual_machine_gui_test.moc"