public void TestCssCombinedCodepoint()
{
var kkkk = 0x7FFF - 65532;
Z3Provider solver = new Z3Provider();
Sort bv64 = solver.MkBitVecSort(64);
Sort bv16 = solver.CharacterSort;
Expr hs = solver.MkConst("hs", bv16);
Expr ls = solver.MkConst("ls", bv16);
Expr res = solver.MkConst("res", bv64);
Expr maxVal = solver.MkNumeral(0x10FFFF, bv64); //max 16 bit nr
Expr x = solver.ConvertBitVector(hs, bv64);
Expr y = solver.ConvertBitVector(ls, bv64);
Expr _0x10000 = solver.MkNumeral(0x10000, bv64);
Expr _0xD800 = solver.MkNumeral(0xD800, bv64);
Expr _0x400 = solver.MkNumeral(0x400, bv64);
Expr _0xDC00 = solver.MkNumeral(0xDC00, bv64);
ushort tmpLS = ((ushort)0xdfff) - ((ushort)0xdc00);
for (int i = 0xdc00; i <= 0xdfff; i++ )
{
int j = (i - 0xdc00) >> 8;
int k = (i >> 8) & 3;
Assert.AreEqual<int>(j, k);
}
int tmpHS = (((int)0xdbff) - ((int)0xd800)) * ((int)0x400);
//int tmpHS = (((int)0xdbff) - ((int)0xd800)) << 10;
int tmpHSLS = tmpLS + tmpHS;
int maxcodepoint = tmpHSLS + 0x10000;
Expr cp = solver.MkCharAdd(_0x10000,
solver.MkCharAdd(solver.MkCharMul(solver.MkCharSub(x, _0xD800), _0x400),
solver.MkCharSub(y, _0xDC00)));
Expr ls_is_lowSurrogate =
solver.MkAnd(solver.MkCharGe(ls, solver.MkNumeral(0xdc00, bv16)),
solver.MkCharLe(ls, solver.MkNumeral(0xdfff, bv16)));
Expr hs_is_highSurrogate =
solver.MkAnd(solver.MkCharGe(hs, solver.MkNumeral(0xd800, bv16)),
solver.MkCharLe(hs, solver.MkNumeral(0xdbff, bv16)));
Expr assert = solver.Simplify(solver.MkAnd(
ls_is_lowSurrogate,
hs_is_highSurrogate,
solver.MkEq(res, cp)));
//string s = solver.PrettyPrint(assert);
solver.MainSolver.Assert(assert);
var model = solver.MainSolver.GetModel(solver.MkCharLt(maxVal, res), hs, ls, res);
Assert.IsNull(model);
//if (model != null)
//{
// int hsVal = solver.GetNumeralInt(model[hs].Value);
// int lsVal = solver.GetNumeralInt(model[ls].Value);
// long resval = solver.GetNumeralUInt(model[res].Value);
// Assert.AreEqual<long>(CssCombinedCodepoint(hsVal, lsVal), resval);
//}
}