Example #1
0
        public void TestHtmlDecode1b()
        {
            string     bek    = @"
program B(input){replace{
    ""�""       ==> ""�""; //dont decode
    ""&#[0-9]{2};"" ==> [(10*(#2-48))+(#3-48)];  //decode
    ""&#$"" ==> ""&#"";  //keep
    else            ==> [#0]; //default
  };
}
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var        test   = BekConverter.BekToSTb(solver, bek).ExploreBools();

            var css = solver.CharSetProvider;

            StringBuilder sb = new StringBuilder();

            test.ToJS(x => { sb.AppendLine(x); return; });

            var meth = test.Compile();

            var res = meth.Apply("&�&&#");

            Assert.AreEqual <string>("&&#00;&&#", res);

            var res2 = meth.Apply(res);

            Assert.AreEqual <string>(res, res2);
        }
Example #2
0
        public void TestExplore1()
        {
            string     pgm    = @"
program IfThenElseSample(t) { 
  return iter(c in t) [r := 0; s := 0;]{
    case ((c >= 'A') && (c <= 'B')): 
      if (c < 'B') {
        yield (c+1);
      } else {
        yield (c,c);
        r := 1;
      }
    case(true):
      raise E1;
    } end {
    case (r == 0):
      raise E2;
    case (true):
      yield ();
    };
}";
            Z3Provider solver = new Z3Provider();
            var        stb    = BekConverter.BekToSTb(solver, pgm);
            //stb.ToST().ShowGraph(1);
            var sft = stb.Explore();

            //sft.ToST().ShowGraph(1);
            Assert.AreEqual <int>(2, sft.StateCount);
            CheckFullEquivalence(sft.ToST(), stb.ToST());
        }
Example #3
0
        public void Test_a2b_Error()
        {
            string     bek    = @"
program a2b(_){ 
  replace {
     ""a"" ==> ""b""; 
  };
}";
            Z3Provider solver = new Z3Provider();
            var        st     = BekConverter.BekToSTb(solver, bek).ExploreBools();
            var        meth   = st.Compile();

            try
            {
                meth.Apply("a_a_a___");
                Assert.IsTrue(false);
            }
            catch (Exception e)
            {
                Assert.AreEqual <string>("a2b", e.Message);
            }
            var res = meth.Apply("aaa");

            Assert.AreEqual <string>("bbb", res);
        }
Example #4
0
        public void TestEq1_a()
        {
            string     bek1   = @"
program decode(input) {
  return iter(c in input)[pc := 0;]{
    case ((pc == 0) && (c == 'a')) :                   
      pc := 1; 
      yield (c,c+1);
    case ((pc == 1) && ((c == 'b'))) : 
      pc := 1;          
      yield (c,c); 
    case ((pc == 1) && (c == 'a')) : 
      pc := 2;          
      yield (c);
    case (true):
      raise Error;
} end {
    case (pc == 2):
      yield ('a');
    case (true):
      raise Error;
};
}
";
            string     bek2   = @" 
program decode(input) {
  return iter(c in input)[pc := 0;]{
    case ((pc == 0) && (c == 'a')) :                   
      pc := 1; 
      yield (c);
    case ((pc == 1) && ((c == 'b'))) : 
      pc := 1;          
      yield (c,c); 
    case ((pc == 1) && (c == 'a')) : 
      pc := 2;          
      yield (c+1,c);
    case (true):
      raise Error;
} end { 
    case (pc == 2):
      yield ('a');
    case (true):
      raise Error;
};
}
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);

            Func <IEnumerable <Expr>, string> GetString = w =>
            {
                return(new String(Array.ConvertAll(new List <Expr>(w).ToArray(), x => (char)solver.GetNumeralInt(x))));
            };

            var A = BekConverter.BekToSTb(solver, bek1).ExploreBools().ToST().Explore();
            var B = BekConverter.BekToSTb(solver, bek2).ExploreBools().ToST().Explore();

            var witness = A.Neq1(B);

            Assert.IsNull(witness);
        }
Example #5
0
        public void TestSTbComposition3()
        {
            string     pgm    = @"
function HS(x) = ((55296 <= x) && (x <= 56319));
function LS(x) = ((56320 <= x) && (x <= 57343));
program Fix(t) { 
  return iter(c in t)[q0 := true; r := 0;] {
    case (q0): 
      if (HS(c)) {r := c;q0:=false;}
      else {
        if (LS(c)) { yield(0xFFFD); r:=0;}
        else {yield(c); r:=0;}
      }
    case (true):
      if (HS(c)) {yield(0xFFFD); r := c;}
      else { 
        if (LS(c)) {yield(r,c); r:=0; q0:=true;}
        else {yield(0xFFFD,c); r:=0; q0:=true;}
      }
    } end {
   case (!q0):
      yield (0xFFFD);
};
}";
            Z3Provider solver = new Z3Provider();
            var        A      = BekConverter.BekToSTb(solver, pgm).ExploreBools();
            //A.ShowGraph();
            var AA   = A.Compose(A);
            var AAAA = AA.Compose(AA);
            //AA.ShowGraph();
            var C = AAAA.Simplify(3);
            // AAs.ShowGraph();
        }
Example #6
0
        public void TestSTbComposition2()
        {
            string     pgm    = @"
program A(t) { 
  return iter(c in t)[b := false; r := 0;] {
    case (b): 
      if (r == c) {yield();}
      else {yield(c); r:= c;}
    case (true):
      r := c; b := true; 
      yield(c);
    } end {
   case (true):
      yield ();
};
}";
            Z3Provider solver = new Z3Provider();
            var        A      = BekConverter.BekToSTb(solver, pgm).ExploreBools();
            //A.ShowGraph();
            var AA = A.Compose(A);
            //AA.ShowGraph();

            var A_exe = A.Compile();
            var s     = A_exe.Apply("00001111122333");

            Assert.AreEqual <string>("0123", s);

            var AA_exe = AA.Compile();
            var s2     = AA_exe.Apply("00001111122333");

            Assert.AreEqual <string>("0123", s2);
        }
Example #7
0
        public void TestEndAnchor()
        {
            string     bek    = @"
program sample(_){ 
  replace {
    ""ab$"" ==> ""123="";
    ""a$""  ==> ""12=="";
}}
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var        test   = BekConverter.BekToSTb(solver, bek);
            var        test1  = test.ExploreBools();
            //test1.ShowGraph();
            var meth = test1.Compile();

            //just test on couple of samples
            Assert.AreEqual <string>("123=", meth.Apply("ab"));
            Assert.AreEqual <string>("12==", meth.Apply("a"));
            //must throw in other cases
            try
            {
                meth.Apply("abab");
                Assert.Fail("meth did not throw an excetion");
            }
            catch (Exception e)
            {
                Assert.AreEqual <string>("sample_B", e.Message);
            }
        }
Example #8
0
        public void TestRegexEscaping()
        {
            string     bek    = @"
program RegexEscape(_){ replace {
  ""\t"" ==> ""\\t"";
  ""\n"" ==> ""\\n"";
  ""\f"" ==> ""\\f"";
  ""\r"" ==> ""\\r"";
  @""(\ |\#|\$|\(|\)|\*|\+|\.|\?|\[|\\|\^|\{|\|)"" ==> ['\\',#0];
  else ==> [#0];
}}
//==
//js(RegexEscape);
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var        stb    = BekConverter.BekToSTb(solver, bek);
            var        st     = stb.ExploreBools().ToST();
            //st.ShowGraph();
            var meth = st.STb.Compile();

            //st.STb.ToJS("../../../GeneratedCodeSamples/RegexEscape.html", true);

            //just test on couple of samples
            Assert.AreEqual <string>(@"\\\.\$xabc\^", meth.Apply(@"\.$xabc^"));
            Assert.AreEqual <string>(@"\(\)\[]\{}\?\.\|", meth.Apply(@"()[]{}?.|"));
        }
Example #9
0
        public void TestIfThenElseStmt()
        {
            string     pgm    = @"
program IfThenElseSampleTmp(t) { 
  return iter(c in t) [r := 0;]{
    case (c > 10): 
      if (c < 20) {
        yield (c+1);
      } else {
        yield (c-1);
        r := 1;
      }
    case(true):
      raise X;
    } end {
    case (r == 0):
      raise Y;
    case (true):
      yield ();
    };
}";
            Z3Provider solver = new Z3Provider();
            var        stb    = BekConverter.BekToSTb(solver, pgm);
            //stb.Explore().ShowGraph();
            //stb.ShowGraph();
            //stb.ToST().ShowGraph();
            //stb.Explore().ShowGraph();
        }
Example #10
0
        public void TestRaiseStmt()
        {
            string     pgm    = @"
program dummy(t) { 
  return iter(c in t) [r := 0;]{
    case (c > 'z'): 
      r := 0;
      yield (c + 1);
    case (c < '9'):
      raise E1;
    case (c < 'z'):
      r := 1;
      yield (c + c);
    case (true):
      raise E2;
    }end{
    case(r == 0):
      yield('h','e','l','l','o');
    case(true):
      raise E3;
    }; 
}";
            Z3Provider solver = new Z3Provider();
            var        stb    = BekConverter.BekToSTb(solver, pgm);
            //stb.ShowGraph();
            //stb.ToST().ShowGraph();
            //stb.ToST().Explore().ShowGraph();
        }
Example #11
0
        public void TestSTbSimplify0()
        {
            string     pgm    = @"
program test(input){
  return iter(c in input)[q := true; r := 0;]
  {
    case (q): 
      r := r + c;
      q := false;
    case (!q):
      r := 0;
      q := true;
    end case (true):
      yield(r);
  };
}
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var        dec    = BekConverter.BekToSTb(solver, pgm);
            var        st     = dec.ExploreBools();
            var        sts    = st.Simplify();

            Assert.AreEqual <int>(2, st.StateCount);
            var st_st = st.Compose(st).ExploreBools();

            Assert.AreEqual <int>(2, st_st.StateCount);
        }
Example #12
0
        public void TestBase16Encode()
        {
            string     bek    = @"
function E(x)=ite(x < 10, x + 48, x + 55);
program base16encode(input){ 
  replace {
    @""[\0-\xFF]""  ==> [E(#0 >> 4),E(#0 & 0xF)];
  }
}
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var        test   = BekConverter.BekToSTb(solver, bek).ExploreBools();
            //test.ToST().ShowGraph();

            StringBuilder sb = new StringBuilder();

            test.ToJS(x => { sb.AppendLine(x); return; });

            var meth = test.Compile();

            var res = meth.Apply("012");

            Assert.AreEqual <string>("303132", res);

            res = meth.Apply("\0\x01\x02\x03");
            Assert.AreEqual <string>("00010203", res);
        }
Example #13
0
        public void TestBase64Decode()
        {
            string     bek    = @"
function D(x)=(ite(x=='/',63,ite(x=='+',62,ite(x<='9',x+4,ite(x<='Z',x-65,x-71)))));
program base64decode(_){ 
  replace {
    ""[a-zA-Z0-9+/]{4}""   ==> [(D(#0)<<2)|bits(5,4,D(#1)), (bits(3,0,D(#1))<<4)|bits(5,2,D(#2)), (bits(1,0,D(#2))<<6)|D(#3)];
    ""[a-zA-Z0-9+/]{3}=$"" ==> [(D(#0)<<2)|bits(5,4,D(#1)), (bits(3,0,D(#1))<<4)|bits(5,2,D(#2))];
    ""[a-zA-Z0-9+/]{2}==$""==> [(D(#0)<<2)|bits(5,4,D(#1))];
  }
}
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);

            var x = solver.MkVar(1, solver.IntSort);

            Console.WriteLine(((IntSymbol)x.FuncDecl.Name).Int);

            var test = BekConverter.BekToSTb(solver, bek).ExploreBools();
            //test.ToST().ShowGraph();

            var meth = test.Compile();

            Assert.AreEqual <string>("Man", meth.Apply("TWFu"));
        }
Example #14
0
        public void TestBase64Encode()
        {
            string     bek    = @"

function E(x)=(ite(x<=25,x+65,ite(x<=51,x+71,ite(x<=61,x-4,ite(x==62,'+','/')))));

program base64encode(_){ 
  replace {
    @""[\0-\xFF]{3}""  ==> [E(Bits(7,2,#0)), E((Bits(1,0,#0)<<4)|Bits(7,4,#1)), E((Bits(3,0,#1)<<2)|Bits(7,6,#2)), E(Bits(5,0,#2))];
    @""[\0-\xFF]{2}$"" ==> [E(Bits(7,2,#0)), E((Bits(1,0,#0)<<4)|Bits(7,4,#1)), E(Bits(3,0,#1)<<2), '='];
    @""[\0-\xFF]$""    ==> [E(Bits(7,2,#0)), E(Bits(1,0,#0)<<4), '=', '='];
  }
}
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var        test   = BekConverter.BekToSTb(solver, bek).ExploreBools();
            //test.ToST().ShowGraph();

            StringBuilder sb = new StringBuilder();

            test.ToJS(x => { sb.AppendLine(x); return; });

            var meth = test.Compile();

            Assert.AreEqual <string>("TWFu", meth.Apply("Man"));
        }
Example #15
0
        public void TestHtmlEncodeStrictJSgen()
        {
            string bek = @"
function H(x) = ite((0 <= x) && (x <= 9), x + 48, x + 55);
program HtmlEncode(_){ 
  replace {
    ""<""   ==> ""&lt;"";
    "">""   ==> ""&gt;"";
    ""\x22""==> ""&quot;"";
    ""&""   ==> ""&amp;"";
    ""\'""  ==> ""&apos;"";
    //encode all control and non ascii chars
    @""[\x01-\x0F]""          ==> ['&','#','X', H(#0), ';']; //do not encode \0
    @""[\x10-\x1F\x7F-\xFF]"" ==> ['&','#','X', H(#0 >> 4), H(#0 & 0xF), ';'];
    @""[\u0100-\u0FFF]""      ==> ['&','#','X', H(#0 >> 8), H((#0 >> 4) & 0xF), H(#0 & 0xF), ';'];
    @""[\u1000-\uFFFF]""      ==> ['&','#','X', H(#0 >> 12), H((#0 >> 8) & 0xF), H((#0 >> 4) & 0xF), H(#0 & 0xF), ';'];
    else ==> [#0];
}}
";
            //fixed HtmlDecode patterns

            StringBuilder sb     = new StringBuilder(bek);
            Z3Provider    solver = new Z3Provider(BitWidth.BV16);
            var           test   = BekConverter.BekToSTb(solver, sb.ToString());
            var           test1  = test.ExploreBools();
            //test1.ToST().ShowGraph();

            //test1.ToJS("../../../GeneratedCodeSamples/HtmlEncodeStrict.html", true);
        }
Example #16
0
        public void TestSTbComposition0()
        {
            string     pgm    = @"
program A(t) { 
  return iter(c in t)[q := 0;] {
    case ((q == 0) && (c == 'a')): 
        yield (c); 
        q:= 1;
   case ((q == 1) && (c == 'a')): 
      yield (c+1);
      q := 0;
  case ((q == 1) && (c == 'b')): 
      yield (c); 
      q:= 1;
  case (true):
      raise error;
    } end {
   case (q == 1):
      raise error;
};
}";
            Z3Provider solver = new Z3Provider();
            var        A      = BekConverter.BekToSTb(solver, pgm).ExploreBools();
            var        AA     = A.Compose(A);
            var        AAs    = AA.Simplify();

            var A_exe = A.Compile();
            var s     = A_exe.Apply("aaaa");

            Assert.AreEqual <string>("abab", s);
        }
Example #17
0
        public void Test_a2b()
        {
            string     bek    = @"
program a2b(_){replace{""a"" ==> ""bb""; else ==> [#0];};}
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var        test   = BekConverter.BekToSTb(solver, bek).ExploreBools();

            var css = solver.CharSetProvider;

            StringBuilder sb = new StringBuilder();

            test.ToJS(x => { sb.AppendLine(x); return; });

            var meth = test.Compile();
            //test.ShowGraph();

            var res = meth.Apply("aaac");

            Assert.AreEqual <string>("bbbbbbc", res);

            var res2 = meth.Apply(res);

            Assert.AreEqual <string>(res, res2);
        }
Example #18
0
 public void TestCssEncodeBekRoundtrip()
 {
     Z3Provider solver = new Z3Provider();
     var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode.bek");
     var sb = new StringBuilder();
     stb.ToBek(sb);
     var stb2 = BekConverter.BekToSTb(solver, sb.ToString());
     CheckFullEquivalence(stb, stb2);
 }
Example #19
0
 // [TestMethod]
 public void DecodeDecode()
 {
     Z3Provider solver = new Z3Provider();
     var A = BekConverter.BekToSTb(solver, BekConverter.BekFileToBekProgram(sampleDir + "bek/Base64decode.bek")).ExploreBools().ToST();
     var ID = ST<FuncDecl, Expr, Sort>.MkId(solver, solver.CharSort);
     var st = A.Compose(A);
     //st.ShowGraph();
     var sfa1 = st.ToSFA().Automaton;
     var sfa = ConvertToAutomatonOverBvSet(solver, sfa1).Determinize(solver.CharSetProvider).MinimizeHopcroft(solver.CharSetProvider);
     //solver.CharSetProvider.ShowGraph(sfa, "test");
 }
Example #20
0
        public void TestBase64Decode()
        {
            Z3Provider solver = new Z3Provider();
            var        bek    = BekConverter.BekFileToBekProgram(sampleDir + "bek/Base64decode.bek");
            var        st     = BekConverter.BekToSTb(solver, bek).ExploreBools().ToST();

            st.Simplify();
            //st.ShowGraph();
            var st0 = st.RestrictDomain(@"^([AB]{3})*$");
            //st0.ShowGraph();
            var st1 = st0.Explore();
            //st1.Simplify();
            //st1.ShowGraph();
            //st.ToDot("c:/tmp/b64d.dot");
            var sft = st.Explore();
            var Q   = sft.StateCount;
            int M   = 0;
            int F   = 0;
            int tot = 0;
            var tmp = new Dictionary <Expr, int>();

            foreach (var m in sft.GetMoves())
            {
                if (m.Label.IsFinal)
                {
                    F   += 1;
                    tot += 1;
                }
                else
                {
                    M += 1;
                    int k = 0;
                    if (tmp.TryGetValue(m.Label.Guard, out k))
                    {
                        tot += k;
                    }
                    else
                    {
                        foreach (var v in solver.MainSolver.FindAllMembers(m.Label.Guard))
                        {
                            k += 1;
                        }
                        tot += k;
                        tmp[m.Label.Guard] = k;
                    }
                }
            }
            Console.WriteLine(tot);


            Assert.AreEqual <int>(87, Q);
        }
Example #21
0
        public void Test_a2b_ElseX()
        {
            string     bek    = @"
program a2b(_){ 
  replace {
     ""a"" ==> ""b"";
     else  ==> ""X"";
  }
}";
            Z3Provider solver = new Z3Provider();
            var        st     = BekConverter.BekToSTb(solver, bek).ExploreBools();
            var        meth   = st.Compile();
            var        res    = meth.Apply("a_a_aX");

            Assert.AreEqual <string>("bXbXbX", res);
        }
Example #22
0
        public void Test_aa2b_Delete()
        {
            string     bek    = @"
program a2b(_){ 
  replace {
     ""aa"" ==> ""b""; 
     else   ==> [];
  };
}";
            Z3Provider solver = new Z3Provider();
            var        st     = BekConverter.BekToSTb(solver, bek).ExploreBools();
            var        meth   = st.Compile();
            var        res    = meth.Apply("aa_a_aa__aaa_");

            Assert.AreEqual <string>("bbb", res);
        }
Example #23
0
        public void TestLengthConflict2()
        {
            string     bek1   = @"
program decode(input){ 
replace { 
  ""&amp;"" ==> ""&""; 
  ""&lt;"" ==> ""<""; 
  ""&gt;"" ==> "">""; 
  else ==> [#0]; 
}
} 
";
            string     bek2   = @"
program decode(input){ 
replace { 
  ""&amp;"" ==> ""&""; 
  ""&lt;"" ==> ""<""; 
  ""&gt;"" ==> "">>""; 
  else ==> [#0]; 
}
} 
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var        test1  = BekConverter.BekToSTb(solver, bek1).ExploreBools();
            //test1.ShowGraph();
            var meth1 = test1.Compile();
            var test2 = BekConverter.BekToSTb(solver, bek2).ExploreBools();
            //test1.ShowGraph();
            var meth2 = test2.Compile();

            //just test on couple of samples
            Assert.AreEqual <string>("<", meth1.Apply("&lt;"));
            Assert.AreEqual <string>(">", meth1.Apply("&gt;"));
            Assert.AreEqual <string>("&g>", meth1.Apply("&g&gt;"));
            Assert.AreEqual <string>("&g>", meth1.Apply("&g&gt;"));

            var d1      = test1.ToST().Explore();
            var d2      = test2.ToST().Explore();
            var witness = d1.Neq1(d2);

            Assert.IsFalse(witness == null);
            var inp  = new String(Array.ConvertAll(witness.ToArray(), x => (char)solver.GetNumeralInt(x)));
            var out1 = meth1.Apply(inp);
            var out2 = meth2.Apply(inp);

            Assert.AreNotEqual <string>(out1, out2);
        }
Example #24
0
        public void TestHtmlEncodeStrict()
        {
            string bek = @"
function H(x) = ite((0 <= x) && (x <= 9), x + 48, x + 55);
program HtmlEncode(_){ 
  replace {
    ""<""   ==> ""&lt;"";
    "">""   ==> ""&gt;"";
    ""\x22""==> ""&quot;"";
    ""&""   ==> ""&amp;"";
    ""\'""  ==> ""&apos"";
    @""[\x01-\x0F]""          ==> ['&','#','X', H(#0), ';']; //do not encode \0
    @""[\x10-\x1F\x7F-\xFF]"" ==> ['&','#','X', H(#0 >> 4), H(#0 & 0xF), ';'];
    @""[\u0100-\u0FFF]""      ==> ['&','#','X', H(#0 >> 8), H((#0 >> 4) & 0xF), H(#0 & 0xF), ';'];
    @""[\u1000-\uFFFF]""      ==> ['&','#','X', H(#0 >> 12), H((#0 >> 8) & 0xF), H((#0 >> 4) & 0xF), H(#0 & 0xF), ';'];
    else ==> [#0];
}}
";
            //fixed HtmlDecode patterns

            StringBuilder sb     = new StringBuilder(bek);
            Z3Provider    solver = new Z3Provider(BitWidth.BV16);
            var           test   = BekConverter.BekToSTb(solver, sb.ToString());
            var           test1  = test.ExploreBools();
            //test1.ShowGraph();

            var meth = test1.Compile("Microsoft.Bek.Query.Tests", "HtmlEncodeStrict");

            // test1.ToCS("../../../src/GeneratedCodeSamples/HtmlEncodeStrict.cs", "GeneratedCodeSamples", "HtmlEncodeStrict", false, false);



            string foo  = System.Net.WebUtility.HtmlEncode(@"&&&\0\0&#000;&&&");
            string bazz = System.Net.WebUtility.HtmlDecode(foo + "\\&#01;");

            //just test on couple of samples first
            string[] samples = new string[] { "<.<", ">\xFF   \x7F", };
            for (int i = 0; i < samples.Length; i++)
            {
                var s        = meth.Apply(samples[i]);
                var expected = System.Net.WebUtility.HtmlDecode(s);
                Assert.AreEqual <string>(expected, samples[i]);
            }
        }
Example #25
0
        public void TestFinalCompletion()
        {
            string     bek    = @"
program test(_){ 
  replace {
     ""abc"" ==> ""ABC""; 
     ""bcd"" ==> ""BCD""; 
     else    ==> [#0 + 1];
  };
}";
            Z3Provider solver = new Z3Provider();
            var        test   = BekConverter.BekToSTb(solver, bek);
            var        test1  = test.ExploreBools().ToST();
            //test1.ShowGraph();
            var a2b = test.Compile();

            Assert.AreEqual <string>("ABCef", a2b.Apply("abcde"));
            Assert.AreEqual <string>("bcBCD", a2b.Apply("abbcd"));
        }
Example #26
0
        public void TestPositionConflict2()
        {
            string bek1             = @"
program decode(input){ 
replace { 
  ""&amp;"" ==> ""&""; 
  ""&lt;"" ==> ""<""; 
  ""&gt;"" ==> "">""; 
  @""&\d{3}$"" ==> [(#1|#2)|#3];
  else ==> [#0]; 
}
} 
";
            string bek2             = @"
program decode(input){ 
replace { 
  ""&amp;"" ==> ""&""; 
  ""&lt;"" ==> ""<""; 
  ""&gt;"" ==> "">""; 
  @""&[0-9]{3}$"" ==> [(#1|#2)|#3];
  else ==> [#0]; 
}
}  
";
            Tuple <int, string> foo = Tuple.Create(34, "abc");
            Tuple <int, string> bar = Tuple.Create(34, "ab" + "c");
            bool b = foo.Equals(bar);


            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var        d1     = BekConverter.BekToSTb(solver, bek1).ToST();
            var        d2     = BekConverter.BekToSTb(solver, bek2).ToST();

            var witness = d1.Neq1(d2);

            Assert.IsFalse(witness == null);
            var inp  = new String(Array.ConvertAll(witness.ToArray(), x => (char)solver.GetNumeralInt(x)));
            var out1 = new String(Array.ConvertAll(new List <Expr>(d1.Apply(witness)).ToArray(), x => (char)solver.GetNumeralInt(x)));
            var out2 = new String(Array.ConvertAll(new List <Expr>(d2.Apply(witness)).ToArray(), x => (char)solver.GetNumeralInt(x)));

            solver.Dispose();
            Assert.AreNotEqual <string>(out1, out2);
        }
Example #27
0
        public void TestTrivial()
        {
            string     pgm    = "program trivial(t) { return iter(c in t) {case (true): yield (c);}; }";
            Z3Provider solver = new Z3Provider();
            var        stb    = BekConverter.BekToSTb(solver, pgm);
            var        st1    = stb.ToST();
            //stb.ShowGraph();
            //st1.ShowGraph();
            var st = st1.Explore();

            //st.ShowGraph();
            Assert.AreEqual <int>(2, st.MoveCount); //note: one of the moves is a final output
            Assert.AreEqual <int>(1, st.StateCount);
            Assert.AreEqual <int>(0, st.InitialState);
            var moves = new List <Move <Rule <Expr> > >(st.GetNonFinalMovesFrom(0));

            Assert.AreEqual <int>(1, moves.Count);
            //Assert.AreEqual<Expr>(solver.True, moves[0].Condition.Guard);
        }
Example #28
0
        public void TestLengthConflict()
        {
            string     bek    = @"
program decode(input){ 
replace { 
  ""&amp;"" ==> ""&""; 
  ""&lt;"" ==> ""<""; 
  ""&gt;"" ==> "">""; 
  else ==> [#0]; 
}
} 
";
            Z3Provider solver = new Z3Provider(BitWidth.BV16);
            var        test   = BekConverter.BekToSTb(solver, bek);
            var        test1  = test.ExploreBools();
            //test1.ShowGraph();
            //var meth = test1.Compile();

            //just test on couple of samples
            //Assert.AreEqual<string>("<", meth.Apply("&lt;"));
            //Assert.AreEqual<string>(">", meth.Apply("&gt;"));
            //Assert.AreEqual<string>("&g>", meth.Apply("&g&gt;"));
            //Assert.AreEqual<string>("&g>", meth.Apply("&g&gt;"));

            var dec = test.ToST();
            var d   = dec.Explore();

            var dd = d.Compose(d);
            //var ddmeth = dd.ToSTb().Compile();
            var witness = d.Neq1(dd);

            Assert.IsFalse(witness == null);
            var inp = new String(Array.ConvertAll(witness.ToArray(), x => (char)solver.GetNumeralInt(x)));
            //var out1 = meth.Apply(inp);
            //var out2 = ddmeth.Apply(inp);
            var out1b = new String(Array.ConvertAll(new List <Expr>(dec.Apply(witness)).ToArray(), x => ((char)solver.GetNumeralInt(x))));
            var out2b = new String(Array.ConvertAll(new List <Expr>(dd.Apply(witness)).ToArray(), x => ((char)solver.GetNumeralInt(x))));

            //Assert.AreEqual<string>(out1, out1b);
            //Assert.AreEqual<string>(out2, out2b);
            Assert.AreNotEqual <string>(out1b, out2b);
        }
Example #29
0
        public void Test_aaa2b_Keep()
        {
            string     bek    = @"
program a2b(_){ 
  replace {
     ""aaa"" ==> [#1 + 1];
     else  ==> [#0];
  }
}";
            Z3Provider solver = new Z3Provider();
            var        st     = BekConverter.BekToSTb(solver, bek).ToST();
            //st.ShowGraph();
            var st1 = st.ExploreBools();
            //st1.ShowGraph();
            var stb = st1.ToSTb();
            //stb.ShowGraph();
            var meth = stb.Compile();
            var res  = meth.Apply("ac_aaaaGGhh");

            Assert.AreEqual <string>("ac_baGGhh", res);
        }
Example #30
0
        public void TestRoundtrip1()
        {
            string        pgm    = @"
program IfThenElseSample(t) { 
  return iter(c in t) [r := 0;]{
    case (c > 10): 
      if (c < 20) {
        yield (c+1);
      } else {
        yield (c-1);
        r := 1;
      }
    case(true):
      raise X;
    } end {
    case (r == 0):
      raise Y;
    case (true):
      yield ();
    };
}";
            Z3Provider    solver = new Z3Provider();
            var           stb    = BekConverter.BekToSTb(solver, pgm);
            StringBuilder sb     = new StringBuilder();

            stb.ToBek(sb);
            var stb2 = BekConverter.BekToSTb(solver, sb.ToString());

            //stb2.ShowGraph();
            CheckFullEquivalence(stb.ToST(), stb2.ToST());
            //var sft = stb.Explore();
            //StringBuilder sb2 = new StringBuilder();
            //sft.ToBek(sb2);
            //var sft2 = BekConverter.BekToSTb(solver, sb2.ToString());
            ////StreamWriter sw = new StreamWriter("tmp.bek");
            ////sft2.ToBek(sw);
            ////sw.Close();
            ////sft2.ShowGraph();
            //CheckFullEquivalence(stb.ToST(), sft2.ToST());
        }