예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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();
        }
예제 #4
0
        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("$$$$"));
        }
예제 #5
0
        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);
        }
예제 #6
0
        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. &#38;                                              
            yield(dec2(d1,d2));
            A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0;

          case (D2 && (c == '&')) :     //e.g. &#38&                                              
            yield('&','#', d1, d2);
            A := true; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0;

          case (D2) :                  //e.g. &#38a
            yield('&','#',d1, d2, c);
            A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0;

          case (D1 && (c == ';')) :    //e.g. &#3;
            yield(dec1(d1));  
            A := false; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0;

          case (D1 && (c == '&')) :    //e.g. &#4&
            yield('&','#',d1);
            A := true; H := false; D1 := false; D2 := false; d1 := 0; d2 := 0;

          case (D1 && (('0' <= c) && (c <= '9'))) :  //e.g. &#65
            A := true; H := false; D1 := false; D2 := true; d2 := c;

          case (D1) :                 //e.g. &#6e
            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. &#6
            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("&#48;|&#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);
        }