From 24d8dfc112abb3aab7d68e5963305cbecf5cdcdf Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <colder@php.net> Date: Thu, 11 Dec 2014 17:51:30 +0100 Subject: [PATCH] Add some challenging tests --- .../repair/OffByOne/FirstIndexOf.scala | 31 +++++++++++++++++++ .../repair/OffByOne/FirstIndexOf1.scala | 31 +++++++++++++++++++ .../repair/OffByOne/FirstIndexOf2.scala | 31 +++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 testcases/synthesis/repair/OffByOne/FirstIndexOf.scala create mode 100644 testcases/synthesis/repair/OffByOne/FirstIndexOf1.scala create mode 100644 testcases/synthesis/repair/OffByOne/FirstIndexOf2.scala diff --git a/testcases/synthesis/repair/OffByOne/FirstIndexOf.scala b/testcases/synthesis/repair/OffByOne/FirstIndexOf.scala new file mode 100644 index 000000000..d59131506 --- /dev/null +++ b/testcases/synthesis/repair/OffByOne/FirstIndexOf.scala @@ -0,0 +1,31 @@ +import leon.lang._ +import leon.collection._ +import leon.lang.synthesis._ + + +object FirstIndexOf { + def firstIndexOf(l: List[Int], v: Int): Int = { + l match { + case Cons(h, t) if v == h => 0 + case Cons(h, t) => + if (firstIndexOf(t, v) >= 0) { + firstIndexOf(t, v)+1 + } else { + -1 + } + case Nil() => + -1 + } + } ensuring { + (res: Int) => (if (l.content contains v) { + l.size > res && l.apply(res) == v + } else { + res == -1 + }) && (((l,v), res) passes { + case (Cons(0, Cons(1, Cons(2, Cons(3, Nil())))), 3) => 3 + case (Cons(0, Cons(2, Cons(3, Cons(1, Nil())))), 1) => 3 + case (Cons(0, Cons(1, Cons(3, Cons(1, Nil())))), 1) => 1 + case (Cons(0, Cons(1, Cons(3, Cons(1, Nil())))), 2) => -1 + }) + } +} diff --git a/testcases/synthesis/repair/OffByOne/FirstIndexOf1.scala b/testcases/synthesis/repair/OffByOne/FirstIndexOf1.scala new file mode 100644 index 000000000..382e09a2f --- /dev/null +++ b/testcases/synthesis/repair/OffByOne/FirstIndexOf1.scala @@ -0,0 +1,31 @@ +import leon.lang._ +import leon.collection._ +import leon.lang.synthesis._ + + +object FirstIndexOf { + def firstIndexOf(l: List[Int], v: Int): Int = { + l match { + case Cons(h, t) if v == h => 0 + case Cons(h, t) => + if (firstIndexOf(t, v) >= 0) { + firstIndexOf(t, v) // Should be +1 (Solves with CEGIS) + } else { + -1 + } + case Nil() => + -1 + } + } ensuring { + (res: Int) => (if (l.content contains v) { + l.size > res && l.apply(res) == v + } else { + res == -1 + }) && (((l,v), res) passes { + case (Cons(0, Cons(1, Cons(2, Cons(3, Nil())))), 3) => 3 + case (Cons(0, Cons(2, Cons(3, Cons(1, Nil())))), 1) => 3 + case (Cons(0, Cons(1, Cons(3, Cons(1, Nil())))), 1) => 1 + case (Cons(0, Cons(1, Cons(3, Cons(1, Nil())))), 2) => -1 + }) + } +} diff --git a/testcases/synthesis/repair/OffByOne/FirstIndexOf2.scala b/testcases/synthesis/repair/OffByOne/FirstIndexOf2.scala new file mode 100644 index 000000000..bf78b606f --- /dev/null +++ b/testcases/synthesis/repair/OffByOne/FirstIndexOf2.scala @@ -0,0 +1,31 @@ +import leon.lang._ +import leon.collection._ +import leon.lang.synthesis._ + + +object FirstIndexOf { + def firstIndexOf(l: List[Int], v: Int): Int = { + l match { + case Cons(h, t) if v == h => 0 + case Cons(h, t) => + if (firstIndexOf(t, v) >= 0) { + firstIndexOf(t, v)+2 // Should be +1 + } else { + -1 + } + case Nil() => + -1 + } + } ensuring { + (res: Int) => (if (l.content contains v) { + l.size > res && l.apply(res) == v + } else { + res == -1 + }) && (((l,v), res) passes { + case (Cons(0, Cons(1, Cons(2, Cons(3, Nil())))), 3) => 3 + case (Cons(0, Cons(2, Cons(3, Cons(1, Nil())))), 1) => 3 + case (Cons(0, Cons(1, Cons(3, Cons(1, Nil())))), 1) => 1 + case (Cons(0, Cons(1, Cons(3, Cons(1, Nil())))), 2) => -1 + }) + } +} -- GitLab