diff --git a/src/test/resources/regression/genc/valid/BinarySearch.scala b/src/test/resources/regression/genc/unverified/BinarySearch.scala similarity index 96% rename from src/test/resources/regression/genc/valid/BinarySearch.scala rename to src/test/resources/regression/genc/unverified/BinarySearch.scala index 75e1219a0427aa66c5388f03e7e10d435e1389fb..aec7d2b5ddabc0132d6f9e885eb18c80617f7dc9 100644 --- a/src/test/resources/regression/genc/valid/BinarySearch.scala +++ b/src/test/resources/regression/genc/unverified/BinarySearch.scala @@ -11,7 +11,8 @@ object BinarySearch { var res = -1 (while(low <= high && res == -1) { - val i = (high + low) / 2 + //val i = (high + low) / 2 + val i = low + ((high - low) / 2) val v = a(i) if(v == key) diff --git a/src/test/resources/regression/genc/valid/BinarySearchFun.scala b/src/test/resources/regression/genc/unverified/BinarySearchFun.scala similarity index 77% rename from src/test/resources/regression/genc/valid/BinarySearchFun.scala rename to src/test/resources/regression/genc/unverified/BinarySearchFun.scala index feb7c8cc60eaba0fc119d98c87bf55106e47fb1e..ebc97f6c6d046e2907bda89c795def7026cb4c8f 100644 --- a/src/test/resources/regression/genc/valid/BinarySearchFun.scala +++ b/src/test/resources/regression/genc/unverified/BinarySearchFun.scala @@ -7,20 +7,24 @@ object BinarySearchFun { 0 <= low && low <= high + 1 && high < a.length ) - if(low <= high) { - val i = (high + low) / 2 + if (low <= high) { + //val i = (high + low) / 2 + val i = low + (high - low) / 2 + val v = a(i) - if(v == key) i + if (v == key) i else if (v > key) binarySearch(a, key, low, i - 1) else binarySearch(a, key, i + 1, high) } else -1 }) ensuring(res => res >= -1 && - res < a.length && - (if (res >= 0) - a(res) == key else - (high < 0 || (!occurs(a, low, (high+low)/2, key) && !occurs(a, (high+low)/2, high, key))) + res < a.length && ( + if (res >= 0) + a(res) == key + else + (high < 0 || (!occurs(a, low, low + (high - low) / 2, key) && + !occurs(a, low + (high - low) / 2, high, key))) ) ) @@ -29,13 +33,13 @@ object BinarySearchFun { require(a.length >= 0 && to <= a.length && from >= 0) def rec(i: Int): Boolean = { require(i >= 0) - if(i >= to) + if (i >= to) false else { - if(a(i) == key) true else rec(i+1) + if (a(i) == key) true else rec(i+1) } } - if(from >= to) + if (from >= to) false else rec(from) diff --git a/src/test/resources/regression/genc/valid/MaxSum.scala b/src/test/resources/regression/genc/unverified/MaxSum.scala similarity index 98% rename from src/test/resources/regression/genc/valid/MaxSum.scala rename to src/test/resources/regression/genc/unverified/MaxSum.scala index 1c6fc2432408132dd67505c450c8c6aa00c9c90c..033dfed30a6930f4041c60a1c4f8a9dfbb87d934 100644 --- a/src/test/resources/regression/genc/valid/MaxSum.scala +++ b/src/test/resources/regression/genc/unverified/MaxSum.scala @@ -65,7 +65,7 @@ object MaxSum { val max = sm._2 if (sum == 1244 && max == 999) 0 else -1 - } + } ensuring { _ == 0 } } diff --git a/src/test/resources/regression/genc/valid/AbsArray.scala b/src/test/resources/regression/genc/valid/AbsArray.scala index b3a592f1a7ce3176ba214ff971a2f00c28740f17..581684e7c50d6034e751c152be9afd185e227e73 100644 --- a/src/test/resources/regression/genc/valid/AbsArray.scala +++ b/src/test/resources/regression/genc/valid/AbsArray.scala @@ -1,21 +1,23 @@ import leon.lang._ object AbsArray { - def abs(a: Array[Int]) { - var i = 0; - while (i < a.length) { - a(i) = if (a(i) < 0) -a(i) else a(i) - i = i + 1 - } - } - def main = { val a = Array(0, -1, 2, -3) - abs(a) + def abs() { + require(a.length < 10000) + + var i = 0; + (while (i < a.length && i < 10000) { + a(i) = if (a(i) < 0) -a(i) else a(i) + i = i + 1 + }) invariant (i >= 0 && i <= 10000) + } + + abs() a(0) + a(1) - 1 + a(2) - 2 + a(3) - 3 // == 0 - } + } ensuring { _ == 0 } } diff --git a/src/test/resources/regression/genc/valid/CaseClass.scala b/src/test/resources/regression/genc/valid/CaseClass.scala index bf104e378f0c06ed01dc1e61ae5649684a48684f..83f5988594336f12e67ca63980334a747fcadbb2 100644 --- a/src/test/resources/regression/genc/valid/CaseClass.scala +++ b/src/test/resources/regression/genc/valid/CaseClass.scala @@ -14,6 +14,7 @@ object CaseClass { val d = cyan val z = sub(c, d).g z - } + } ensuring { _ == 0 } } + diff --git a/src/test/resources/regression/genc/valid/ExpressionOrder.scala b/src/test/resources/regression/genc/valid/ExpressionOrder.scala index 5507d8e19284052905e533ae2ba9230a52023ee5..d6620ab3579c500157a57b460dbe2c08f90699e5 100644 --- a/src/test/resources/regression/genc/valid/ExpressionOrder.scala +++ b/src/test/resources/regression/genc/valid/ExpressionOrder.scala @@ -34,7 +34,7 @@ object ExpressionOrder { def f4 = (if (i < 0) d else c)._2 // expression result unused } - def main = + def main = { bool2int(test0(false), 1) + bool2int(test1(42), 2) + bool2int(test2(58), 4) + @@ -43,6 +43,7 @@ object ExpressionOrder { bool2int(test6, 32) + bool2int(test7, 64) + bool2int(test8, 128) + } ensuring { _ == 0 } def test0(b: Boolean) = { val f = b && !b // == false @@ -52,7 +53,7 @@ object ExpressionOrder { val x = f && { c = 1; true } c == 0 - } + }.holds def test1(i: Int) = { require(i > 0) @@ -63,7 +64,7 @@ object ExpressionOrder { val x = { c = c + 3; j } + { c = c + 1; j } * { c = c * 2; j } c == 8 && j == 3 && x == 12 - } + }.holds def test2(i: Int) = { var c = 0; @@ -71,7 +72,7 @@ object ExpressionOrder { if (i < 0) c == 1 else c == 2 - } + }.holds def test3(b: Boolean) = { val f = b && !b // == false @@ -80,7 +81,7 @@ object ExpressionOrder { val x = f || { c = 1; true } || { c = 2; false } c == 1 - } + }.holds def test4(b: Boolean) = { var i = 10 @@ -97,7 +98,7 @@ object ExpressionOrder { } i == 0 && c == 22 - } + }.holds def test5(b: Boolean) = { val f = b && !b // == false @@ -107,17 +108,20 @@ object ExpressionOrder { c = c + (if (f) 0 else 1) c == 0 - } + }.holds def test6 = { val a = Array(0, 1, 2, 3, 4) + def rec(b: Boolean, i: Int): Boolean = { - if (a.length <= i + 1) b - else rec(if (a(i) < a(i + 1)) b else false, i + 1) + require(i >= 0 && i < 2147483647) // 2^31 - 1 + + if (i + 1 < a.length) rec(if (a(i) < a(i + 1)) b else false, i + 1) + else b } rec(true, 0) - } + }.holds def test7 = { var c = 1 @@ -127,7 +131,7 @@ object ExpressionOrder { a(if(a(0) == 0) { c = c + 1; 0 } else { c = c + 2; 1 }) = { c = c * 2; -1 } c == 4 - } + }.holds def test8 = { var x = 0 @@ -139,7 +143,7 @@ object ExpressionOrder { } bar(2) == 0 - } + }.holds def bool2int(b: Boolean, f: Int) = if (b) 0 else f; } diff --git a/src/test/resources/regression/genc/valid/RecursionAndNestedFunctions.scala b/src/test/resources/regression/genc/valid/RecursionAndNestedFunctions.scala index 70f5c150a585d6981a1e656e07f4148a407f0058..25f69538a19412bd8ae8267446d4eb5f05f6247b 100644 --- a/src/test/resources/regression/genc/valid/RecursionAndNestedFunctions.scala +++ b/src/test/resources/regression/genc/valid/RecursionAndNestedFunctions.scala @@ -5,14 +5,15 @@ object RecursionAndNestedFunctions { // Complex way to return i def zzz(i: Int): Int = { val x = 0 + def rec(j: Int): Int = { - if (i - x == j) i + if (i - x == j) i else if (j > i) rec(j - 1) else rec(j + 1) - } + } ensuring { _ == i } rec(4) - } + } ensuring { _ == i } // Complex way to compute 100 + 2 * i @@ -26,9 +27,11 @@ object RecursionAndNestedFunctions { baz(42) } bar(58) + j - i - } + } ensuring { _ == 100 + 2 * i } - def main() = foo(2) - zzz(104) + def main() = { + foo(2) - zzz(104) + } ensuring { _ == 0 } } diff --git a/src/test/resources/regression/genc/valid/TupleArray.scala b/src/test/resources/regression/genc/valid/TupleArray.scala index 576ac3d270e6258ea3c73c48d7d91bfa6e9ed113..1f2354e0613430fb95a995da6a741dda3939b143 100644 --- a/src/test/resources/regression/genc/valid/TupleArray.scala +++ b/src/test/resources/regression/genc/valid/TupleArray.scala @@ -2,12 +2,14 @@ import leon.lang._ object TupleArray { def exists(av: (Array[Int], Int)): Boolean = { - var i = 0; - var found = false; - while (!found && i < av._1.length) { + require(av._1.length < 10000) + + var i = 0 + var found = false + (while (!found && i < av._1.length) { found = av._1(i) == av._2 i = i + 1 - } + }) invariant (i >= 0 && i < 10000) found } @@ -17,6 +19,7 @@ object TupleArray { val e2 = exists((a, -1)) if (e1 && !e2) 0 else -1 - } + } ensuring { _ == 0 } } + diff --git a/src/test/scala/leon/genc/GenCSuite.scala b/src/test/scala/leon/genc/GenCSuite.scala index a8e0368eef6baa1416a14fd492f645ffa53078f2..4292f9583927e3299dde8e4b4d6bdddec0d7f146 100644 --- a/src/test/scala/leon/genc/GenCSuite.scala +++ b/src/test/scala/leon/genc/GenCSuite.scala @@ -163,7 +163,7 @@ class GenCSuite extends LeonRegressionSuite { mkTest(files, cat)(block) } - protected def testValid(cc: String) = forEachFileIn("valid") { (xCtx, prog) => + protected def testDirectory(cc: String, dir: String) = forEachFileIn(dir) { (xCtx, prog) => val converter = convert(xCtx) _ val saver = saveToFile(xCtx) _ val compiler = compile(xCtx, cc) _ @@ -174,6 +174,9 @@ class GenCSuite extends LeonRegressionSuite { pipeline(prog) } + protected def testValid(cc: String) = testDirectory(cc, "valid") + protected def testUnverified(cc: String) = testDirectory(cc, "unverified"); + protected def testInvalid() = forEachFileIn("invalid") { (xCtx, prog) => intercept[LeonFatalError] { GenerateCPhase(xCtx.leon, prog) @@ -199,8 +202,11 @@ class GenCSuite extends LeonRegressionSuite { protected def testAll() = { // Set C compiler according to the platform we're currently running on detectCompiler match { - case Some(cc) => testValid(cc) - case None => test("dectecting C compiler") { fail("no C compiler found") } + case Some(cc) => + testValid(cc) + testUnverified(cc) + case None => + test("dectecting C compiler") { fail("no C compiler found") } } testInvalid()