From 50edd0cb276b7463c608ac9d28f60d0b450853f9 Mon Sep 17 00:00:00 2001
From: Regis Blanc <regwblanc@gmail.com>
Date: Wed, 6 Apr 2016 18:58:38 +0200
Subject: [PATCH] testing higher order function with mutable parameters

---
 .../HigherOrderFunctionsMutableParams1.scala  | 24 +++++++++++++++++
 .../HigherOrderFunctionsMutableParams2.scala  | 22 ++++++++++++++++
 .../HigherOrderFunctionsMutableParams3.scala  | 26 +++++++++++++++++++
 .../HigherOrderFunctionsMutableParams4.scala  | 25 ++++++++++++++++++
 4 files changed, 97 insertions(+)
 create mode 100644 src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams3.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams4.scala

diff --git a/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams1.scala b/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams1.scala
new file mode 100644
index 000000000..4ea4032fb
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams1.scala
@@ -0,0 +1,24 @@
+object HigherOrderFunctionsMutableParams1 {
+
+  case class A(var x: BigInt)
+
+  def app(f: (A) => Unit, a: A): Unit = {
+    f(a)
+  }
+
+  def fImpl(a: A): Unit = {
+    a.x += 1
+  }
+
+
+  def test(): BigInt = {
+    val a = A(0)
+    app(fImpl, a)
+    assert(a.x == 1)
+    app(fImpl, a)
+    assert(a.x == 2)
+    app(fImpl, a)
+    a.x
+  } ensuring(_ == 3)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams2.scala b/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams2.scala
new file mode 100644
index 000000000..dbf341385
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams2.scala
@@ -0,0 +1,22 @@
+object HigherOrderFunctionsMutableParams2 {
+
+  case class A(var x: BigInt)
+
+  def app(f: (A) => BigInt, a: A): BigInt = {
+    f(a)
+  }
+
+  def fImpl(a: A): BigInt = {
+    a.x += 1
+    a.x
+  }
+
+
+  def test(): BigInt = {
+    val a = A(0)
+    app(fImpl, a)
+    app(fImpl, a)
+    app(fImpl, a)
+  } ensuring(_ == 3)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams3.scala b/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams3.scala
new file mode 100644
index 000000000..c8dfc83bb
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams3.scala
@@ -0,0 +1,26 @@
+object HigherOrderFunctionsMutableParams3 {
+
+  case class A(var x: BigInt)
+
+  def app(f: (A) => BigInt, a: A): BigInt = {
+    f(a)
+  }
+
+  def fImpl1(a: A): BigInt = {
+    a.x += 1
+    a.x
+  }
+  def fImpl2(a: A): BigInt = {
+    a.x += 10
+    a.x
+  }
+
+
+  def test(): BigInt = {
+    val a = A(0)
+    app(fImpl1, a)
+    app(fImpl2, a)
+    app(fImpl1, a)
+  } ensuring(_ == 12)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams4.scala b/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams4.scala
new file mode 100644
index 000000000..e379dfef4
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/HigherOrderFunctionsMutableParams4.scala
@@ -0,0 +1,25 @@
+object HigherOrderFunctionsMutableParams4 {
+
+  case class A(var x: BigInt)
+
+  def app(f: (A) => BigInt, a: A): BigInt = {
+    f(a)
+  }
+
+  def test(): BigInt = {
+    val a = A(0)
+    app((a2: A) => {
+      a2.x += 1
+      a2.x
+    }, a)
+    app((a2: A) => {
+      a2.x += 10
+      a2.x
+    }, a)
+    app((a2: A) => {
+      a2.x += 1
+      a2.x
+    }, a)
+  } ensuring(_ == 12)
+
+}
-- 
GitLab