Esempio n. 1
0
pgsExpression *pgsIdent::clone() const
{
	return pnew pgsIdent(*this);
}
void pgsTestSuite::test_expression_record(void)
{
	pgsVarMap vars;

	pgsStmtList * SL1 = 0;

	wxArrayString columns;
	SL1 = pnew pgsStmtList(pgsTestClass::get_cout());

	{
		columns.Add(wxT("a"));
		columns.Add(wxT("b"));
		columns.Add(wxT("c"));
		columns.Add(wxT("d"));
	}

	// r := { a, b, c, d }
	{
		pgsStmt * S = 0;
		S = pnew pgsDeclareRecordStmt(wxT("r"), columns);
		SL1->insert_back(S);
	}

	// r[2][a] := 5
	{
		pgsStmt * S = 0;
		S = pnew pgsExpressionStmt(pnew pgsAssignToRecord(wxT("r"),
				pnew pgsNumber(wxT("2")), pnew pgsString(wxT("a")),
				pnew pgsNumber(wxT("5"))));
		SL1->insert_back(S);
	}

	// r[1][b] := "abc"
	{
		pgsStmt * S = 0;
		S = pnew pgsExpressionStmt(pnew pgsAssignToRecord(wxT("r"),
				pnew pgsNumber(wxT("1")), pnew pgsString(wxT("b")),
				pnew pgsString(wxT("abc"))));
		SL1->insert_back(S);
	}

	// r[0][0] := 1
	{
		pgsStmt * S = 0;
		S = pnew pgsExpressionStmt(pnew pgsAssignToRecord(wxT("r"),
				pnew pgsNumber(wxT("0")), pnew pgsNumber(wxT("0")),
				pnew pgsNumber(wxT("1"))));
		SL1->insert_back(S);
	}

	// w := r
	{
		pgsStmt * S = 0;
		S = pnew pgsExpressionStmt(pnew pgsAssign(wxT("w"),
				pnew pgsIdent(wxT("r"))));
		SL1->insert_back(S);
	}

	// p = (r != w)
	{
		pgsStmt * S = 0;
		S = pnew pgsExpressionStmt(pnew pgsAssign(wxT("p"),
				pnew pgsDifferent(pnew pgsIdent(wxT("r")),
				pnew pgsIdent(wxT("w")))));
		SL1->insert_back(S);
	}

	// r.remove_line(1)
	{
		pgsStmt * S = 0;
		S = pnew pgsExpressionStmt(pnew pgsRemoveLine(wxT("r"),
				pnew pgsNumber(wxT("1"))));
		TS_ASSERT(pgsRemoveLine(wxT("r"), pnew pgsNumber(wxT("1")))
				.value() == wxT("RMLINE(r[1])"));
		SL1->insert_back(S);
	}

	// q = (r != w)
	{
		pgsStmt * S = 0;
		S = pnew pgsExpressionStmt(pnew pgsAssign(wxT("q"),
				pnew pgsDifferent(pnew pgsIdent(wxT("r")),
				pnew pgsIdent(wxT("w")))));
		SL1->insert_back(S);
	}

	// o = (r < w)
	{
		pgsStmt * S = 0;
		S = pnew pgsExpressionStmt(pnew pgsAssign(wxT("o"),
				pnew pgsLower(pnew pgsIdent(wxT("r")),
				pnew pgsIdent(wxT("w")))));
		SL1->insert_back(S);
	}

	SL1->eval(vars);

	// Test symbol table at the end of the execution
	TS_ASSERT(vars[wxT("p")]->value() == wxT("0"));
	TS_ASSERT(vars[wxT("q")]->value() == wxT("1"));
	TS_ASSERT(vars[wxT("o")]->value() == wxT("1"));

	pdelete(SL1);
}
Esempio n. 3
0
void pgsTestSuite::test_statement_stmt(void)
{
	// Symbol table
	pgsVarMap vars;

	// Test Assignment Statement
	{
		pgsStmt * S1 = 0, * S2 = 0, * S3 = 0;

		// x := 0
		S1 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("x"),
				pnew pgsNumber(wxT("0"), pgsInt)));
		S1->eval(vars);
		
		// y := 2
		S2 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("y"),
				pnew pgsNumber(wxT("2"), pgsInt)));
		S2->eval(vars);

		// Check that assignments went fine
		TS_ASSERT(vars[wxT("x")]->value() == wxT("0"));
		TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));

		// x := 1
		S3 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("x"),
				pnew pgsNumber(wxT("1"), pgsInt)));
		S3->eval(vars);

		TS_ASSERT(vars[wxT("x")]->value() == wxT("1"));
		TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));

		pdelete(S1);
		pdelete(S2);
		pdelete(S3);
	}

	// Test If Statement (if 0 then z := 0 else z := 1 fi)
	{
		pgsStmt * S1 = 0;
		pgsStmtList * SL1 = 0, * SL2 = 0;

		// z := 0
		SL1 = pnew pgsStmtList(pgsTestClass::get_cout());
		SL1->insert_front(pnew pgsExpressionStmt(pnew pgsAssign(wxT("z"),
				pnew pgsNumber(wxT("0"), pgsInt))));
		
		// z := 1
		SL2 = pnew pgsStmtList(pgsTestClass::get_cout());
		SL2->insert_front(pnew pgsExpressionStmt(pnew pgsAssign(wxT("z"),
				pnew pgsNumber(wxT("1"), pgsInt))));

		// if 0 then z := 0 else z := 1 fi
		S1 = pnew pgsIfStmt(pnew pgsNumber(wxT("0"), pgsInt), SL1, SL2);
		S1->eval(vars);

		TS_ASSERT(vars[wxT("x")]->value() == wxT("1"));
		TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));
		TS_ASSERT(vars[wxT("z")]->value() == wxT("1"));

		pdelete(S1);
	}

	// Test If Statement (if 1 then z := 0 else z := 1 fi)
	{
		pgsStmt * S1 = 0;
		pgsStmtList * SL1 = 0, * SL2 = 0;

		// z := 0
		SL1 = pnew pgsStmtList(pgsTestClass::get_cout());
		SL1->insert_front(pnew pgsExpressionStmt(pnew pgsAssign(wxT("z"),
				pnew pgsNumber(wxT("0"), pgsInt))));
		
		// z := 1
		SL2 = pnew pgsStmtList(pgsTestClass::get_cout());
		SL2->insert_front(pnew pgsExpressionStmt(pnew pgsAssign(wxT("z"),
				pnew pgsNumber(wxT("1"), pgsInt))));

		// if 1 then z := 0 else z := 1 fi
		S1 = pnew pgsIfStmt(pnew pgsNumber(wxT("1"), pgsInt), SL1, SL2);
		S1->eval(vars);

		TS_ASSERT(vars[wxT("x")]->value() == wxT("1"));
		TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));
		TS_ASSERT(vars[wxT("z")]->value() == wxT("0"));

		pdelete(S1);
	}
	
	// Test While Statement (while i do s := s + i; i := i-1 done)
	{
		pgsStmt * S1 = 0, * S2 = 0, * S3 = 0;
		pgsStmtList * SL1 = 0;

		// i := 3
		pgsExpressionStmt(pnew pgsAssign(wxT("i"), pnew pgsNumber(wxT("3"),
				pgsInt))).eval(vars);
		
		// s := 0
		pgsExpressionStmt(pnew pgsAssign(wxT("s"), pnew pgsNumber(wxT("0"),
				pgsInt))).eval(vars);

		TS_ASSERT(vars[wxT("x")]->value() == wxT("1"));
		TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));
		TS_ASSERT(vars[wxT("z")]->value() == wxT("0"));
		TS_ASSERT(vars[wxT("i")]->value() == wxT("3"));
		TS_ASSERT(vars[wxT("s")]->value() == wxT("0"));
		TS_ASSERT(vars.size() == 5);
		
		// i == 3 ?
		TS_ASSERT(pgsIdent(wxT("i")).eval(vars)->value() == wxT("3"));
		// s + i == 3 ?
		TS_ASSERT(pgsPlus(pnew pgsIdent(wxT("s")),
				pnew pgsIdent(wxT("i"))).eval(vars)->value() == wxT("3"));
		
		// s := s + i
		S1 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("s"),
				pnew pgsPlus(pnew pgsIdent(wxT("s")),
						pnew pgsIdent(wxT("i")))));
		// i := i-1
		S2 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("i"),
				pnew pgsMinus(pnew pgsIdent(wxT("i")),
						pnew pgsNumber(wxT("1"), pgsInt))));
		SL1 = pnew pgsStmtList(pgsTestClass::get_cout());
		SL1->insert_front(S2);
		SL1->insert_front(S1);

		// while i do s := s + i; i := i-1 done
		S3 = pnew pgsWhileStmt(pnew pgsIdent(wxT("i")), SL1);
		S3->eval(vars);
		pdelete(S3);

		TS_ASSERT(vars[wxT("x")]->value() == wxT("1"));
		TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));
		TS_ASSERT(vars[wxT("z")]->value() == wxT("0"));
		TS_ASSERT(vars[wxT("i")]->value() == wxT("0"));
		TS_ASSERT(vars[wxT("s")]->value() == wxT("6"));
		TS_ASSERT(vars.size() == 5);
	}
	
	// Test While Statement
	// while i < 10 do
	//   i := i + i;
	//   if i > 5 then
	//     break;
	//   else
	//     continue;
	//     s := s + 1;
	//   fi
	// done
	{
		pgsStmt * S1 = 0, * S2 = 0, * S3 = 0, * S4 = 0;
		pgsStmtList * SL1 = 0, * SL2 = 0;

		// i := 0
		pgsExpressionStmt(pnew pgsAssign(wxT("i"), pnew pgsNumber(wxT("0"),
				pgsInt))).eval(vars);
		
		// s := 5
		pgsExpressionStmt(pnew pgsAssign(wxT("s"), pnew pgsNumber(wxT("5"),
				pgsInt))).eval(vars);

		TS_ASSERT(vars[wxT("i")]->value() == wxT("0"));
		TS_ASSERT(vars[wxT("s")]->value() == wxT("5"));
		
		// i := i + 1
		S1 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("i"),
				pnew pgsPlus(pnew pgsIdent(wxT("i")),
						pnew pgsNumber(wxT("1"), pgsInt))));
		
		// s := s + 1
		S2 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("s"),
				pnew pgsPlus(pnew pgsIdent(wxT("s")),
						pnew pgsNumber(wxT("1"), pgsInt))));

		// s := s + 1; continue
		SL2 = pnew pgsStmtList(pgsTestClass::get_cout());
		SL2->insert_back(pnew pgsContinueStmt());
		SL2->insert_back(S2);
		
		// if i > 5 ... fi
		S3 = pnew pgsIfStmt(pnew pgsGreater(pnew pgsIdent(wxT("i")),
				pnew pgsNumber(wxT("5"))), pnew pgsBreakStmt(), SL2);

		// while ... done
		SL1 = pnew pgsStmtList(pgsTestClass::get_cout());
		SL1->insert_back(S1);
		SL1->insert_back(S3);
		S4 = pnew pgsWhileStmt(pnew pgsLower(pnew pgsIdent(wxT("i")),
				pnew pgsNumber(wxT("10"))), SL1);
		S4->eval(vars);
		pdelete(S4);

		TS_ASSERT(vars[wxT("i")]->value() == wxT("6"));
		TS_ASSERT(vars[wxT("s")]->value() == wxT("5"));
	}

	// Test Assign Statement with a generator
	{
		pgsExpression * N0 = 0, * N1 = 0, * N2 = 0;
		pgsStmt * S1 = 0, * S2 = 0, * S3 = 0;

		// m := -10
		pgsExpressionStmt(pnew pgsAssign(wxT("m"),
				pnew pgsNumber(wxT("-10")))).eval(vars);

		// integer(m, 10, true, now)
		N0 = pnew pgsGenInt(pnew pgsIdent(wxT("m")), pnew pgsNumber(wxT("10")),
				pnew pgsNumber(wxT("1")), pnew pgsNumber(wxString()
						<< wxDateTime::GetTimeNow()));
		// string(1, 10, 2, now)
		N1 = pnew pgsGenString(pnew pgsNumber(wxT("1")),
				pnew pgsNumber(wxT("10")), pnew pgsNumber(wxT("2")),
						pnew pgsNumber(wxString() << wxDateTime::GetTimeNow()));
		// regex(a{2}[a-zA-Z]{10}c{3}, now)
		N2 = pnew pgsGenRegex(pnew pgsString(wxT("a{2}[a-zA-Z]{10}c{3}")),
						pnew pgsNumber(wxString() << wxDateTime::GetTimeNow()));

		// x := integer(m, 10, true, now)
		S1 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("x"), N0));
		S1->eval(vars);
		// y := string(1, 10, 2, now)
		S2 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("y"), N1));
		S2->eval(vars);
		// z := regex(a{2}[a-zA-Z]{10}c{3}, now)
		S3 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("z"), N2));
		S3->eval(vars);

		wxString result1, result2, result3;
		wxArrayString sav;
		for (int i = 0; i < 21; i++)
		{
			// Check that x result is unique (we wanted to generate a sequence)
			result1 = pgsIdent(wxT("x")).eval(vars)->value();
			TS_ASSERT(sav.Index(result1) == wxNOT_FOUND);
			sav.Add(result1);
			
			// Check that y result is at least 3 characters (two words of 1
			// character with a space in the middle) and less than 21
			result2 = pgsIdent(wxT("y")).eval(vars)->value();
			TS_ASSERT(result2.Length() >= 3 && result2.Length() <= 21);
			
			// Check the regex-based generators
			result3 = pgsIdent(wxT("z")).eval(vars)->value();
			TS_ASSERT(result3.Length() == 15);
			TS_ASSERT(result3.StartsWith(wxT("aa")) && result3.EndsWith(wxT("ccc")));
		}

		pdelete(S1); // Deletes N0
		pdelete(S2); // Deletes N1
		pdelete(S3); // Deletes N2
	}

	
	// Test an unknown identifier
	{
		pgsExpression * E1;
		
		E1 = pnew pgsIdent(wxT("unknown"));
		TS_ASSERT(E1->eval(vars)->value() == wxT(""));
		
		pdelete(E1);
	}
}