public void TestLocalFunc() { string pgm = @" function bar(x, y) = (y + x); function foo(x) = bar(x,1); program incr(w) { return iter(c in w) { case(((foo(c)-1)==c)&&true||false): yield(c + 0 + 1); }; } "; Z3Provider solver = new Z3Provider(); var st = BekConverter.BekToST(solver, pgm); Assert.AreEqual(1, st.StateCount); var moves = new List <Move <Rule <Expr> > >(st.GetNonFinalMovesFrom(st.InitialState)); Assert.AreEqual(1, moves.Count); var move = moves[0]; Assert.AreEqual(solver.True, move.Label.Guard); }
public void TestSanitize() { string pgm = @" program sanitize(t) { return iter(c in t)[ b := false; d := '$'; ] { case (!b && ((c == '\'') || (c == '\" + "\"" + @"'))) : b := false; yield ('\\', c); case (c == '\\') : b := !b; yield (c); case (true) : b := false; yield (c); }; }"; Z3Provider solver = new Z3Provider(); var st1 = BekConverter.BekToST(solver, pgm).ExploreBools(); //st1.ShowGraph(); var st = st1 + st1; st.Simplify(); //st.ShowGraph(); var sft = st.ExploreBools(); //sft.ShowGraph(); Assert.IsTrue(sft.Eq1(st1)); Assert.AreEqual <int>(2, sft.StateCount); }
public void TestCharIn2() { string alpha = @" program alpha(w) { return iter(c in w) { case(c in " + "\"[a-d]\"" + @"): yield('x'); case(true): yield(c); }; } "; string beta = @" program beta(w) { return iter(c in w) { case((c >= 'a') && (c <= 'z')): yield('y'); }; } "; Z3Provider solver = new Z3Provider(); var aST = BekConverter.BekToST(solver, alpha); var bST = BekConverter.BekToST(solver, beta); bool equiv = STModel.Eq1(aST, bST); Assert.IsFalse(equiv); //aST.ShowGraph(); //bST.ShowGraph(); }
public void TestSanitize2() { string pgm = @" program sanitize2(t) { return iter(c in t)[ b := false; r := '$';] { case (!b && ((c == '\'') || (c == '\" + "\"" + @"'))) : b := false; yield ('\\', c); case (c == '\\') : b := !b; yield (c); case (true) : b := false; yield (c); }end{ case (true) : yield (r); }; }"; Z3Provider solver = new Z3Provider(); var st1 = BekConverter.BekToST(solver, pgm); //st1.ShowGraph(); var st = st1 + st1 + st1 + st1; //st.ShowGraph(20); var sft = st.ExploreBools(); //sft.ShowGraph(50); //st.Explore().ShowGraph(); Assert.IsFalse(sft.Eq1(st1)); var w = sft.Diff(st1); Assert.IsNotNull(w); string inputStr = w.Input.GetStringValue(false); string out1 = w.Output1.GetStringValue(false); string out2 = w.Output2.GetStringValue(false); Assert.IsTrue(out1.StartsWith(out2)); Assert.IsTrue(out1.EndsWith("$$$$")); }
public void TestArithm1() { string pgm = @" program incr(w) { return iter(c in w) { case(((c+1-1)==c)&&true||false): yield(c + 0 + 1); }; } "; Z3Provider solver = new Z3Provider(); var st = BekConverter.BekToST(solver, pgm); Assert.AreEqual(1, st.StateCount); var moves = new List <Move <Rule <Expr> > >(st.GetNonFinalMovesFrom(st.InitialState)); Assert.AreEqual(1, moves.Count); var move = moves[0]; //Assert.AreEqual(solver.True, move.Condition.Guard); }
public void TestHtmlDecode2() { string locals = @" function dec2(x,y)=((10*(x-48))+(y-48)); function dec1(y)=(y-48); "; string pgm = @" program decode2(w) { return iter(c in w) [ A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0;] { case (D2 && (c == ';')) : //e.g. & yield(dec2(d1,d2)); A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0; case (D2 && (c == '&')) : //e.g. && yield('&','#', d1, d2); A := true; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0; case (D2) : //e.g. &a yield('&','#',d1, d2, c); A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0; case (D1 && (c == ';')) : //e.g.  yield(dec1(d1)); A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0; case (D1 && (c == '&')) : //e.g. & yield('&','#',d1); A := true; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0; case (D1 && (('0' <= c) && (c <= '9'))) : //e.g. A A := true; H := false; D1 := false; D2 := true; d2 := c; case (D1) : //e.g. e yield('&','#',d1, c); A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0; case (H && (c == '&')) : // &#& yield('&','#'); A := true; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0; case (H && (('0' <= c) && (c <= '9'))) : //e.g.  A := false; H := false; D1 := true; D2 := false; d1 := c; d2 := 0; case (H) : //e.g. &#g yield('&','#', c); A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0; case (A && (c == '#')) : // &# A := false; H := true; D1 := false; D2 := false; d1 := 0; d2 := 0; case (A && (c == '&')) : // && yield('&'); case (A) : // e.g. &3 yield('&',c); A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0; case (c == '&'): // & A := true; case (true) : //any other case yield(c); A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0; } end { //characters to yield when input finished in the middle of a pattern case (D2) : yield('&','#',d1,d2); case (D1) : yield('&','#',d1); case (H) : yield('&','#'); case (A) : yield('&'); case (true): yield(); }; } "; Z3Provider solver = new Z3Provider(); var D = BekConverter.BekToST(solver, locals + pgm); D.Simplify(); var D1 = D.ExploreBools(); D1.Simplify(); var stb = BekConverter.BekToSTb(solver, pgm); //avoid introduction of '0' into the intermediate result var dom = new SFAModel(D1.Solver, D1.Solver.CharSort, D1.Solver.RegexConverter.Convert("0|�").Complement(D1.Solver)); var D1r = D1.RestrictDomain(dom); var DD = D1r + D1r; var w = D1r.Diff(DD); Assert.IsNotNull(w); string i_str = w.Input.GetStringValue(true); string o1_str = w.Output1.GetStringValue(true); string o2_str = w.Output2.GetStringValue(true); Assert.IsFalse(o1_str.Equals(o2_str)); Assert.AreEqual(WebUtility.HtmlDecode(i_str), o1_str); Assert.AreEqual(WebUtility.HtmlDecode(WebUtility.HtmlDecode(i_str)), o2_str); }