tests: intro tests for FFI with C++
authorAlexis Laferrière <alexis.laf@xymus.net>
Thu, 28 Nov 2013 19:29:06 +0000 (14:29 -0500)
committerAlexis Laferrière <alexis.laf@xymus.net>
Thu, 27 Feb 2014 20:05:59 +0000 (15:05 -0500)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

tests/sav/test_ffi_cpp_callbacks.res [new file with mode: 0644]
tests/sav/test_ffi_cpp_header.res [new file with mode: 0644]
tests/sav/test_ffi_cpp_simple_fun.res [new file with mode: 0644]
tests/sav/test_ffi_cpp_strings.res [new file with mode: 0644]
tests/sav/test_ffi_cpp_types.res [new file with mode: 0644]
tests/test_ffi_cpp_callbacks.nit [new file with mode: 0644]
tests/test_ffi_cpp_header.nit [new file with mode: 0644]
tests/test_ffi_cpp_simple_fun.nit [new file with mode: 0644]
tests/test_ffi_cpp_strings.nit [new file with mode: 0644]
tests/test_ffi_cpp_types.nit [new file with mode: 0644]

diff --git a/tests/sav/test_ffi_cpp_callbacks.res b/tests/sav/test_ffi_cpp_callbacks.res
new file mode 100644 (file)
index 0000000..46f13fb
--- /dev/null
@@ -0,0 +1,10 @@
+4
+3
+2
+1
+Vector is empty!
+1234
+Vector is empty!
+1234
+Vector is empty!
+1234
diff --git a/tests/sav/test_ffi_cpp_header.res b/tests/sav/test_ffi_cpp_header.res
new file mode 100644 (file)
index 0000000..2240262
--- /dev/null
@@ -0,0 +1,4 @@
+4
+3
+2
+1
diff --git a/tests/sav/test_ffi_cpp_simple_fun.res b/tests/sav/test_ffi_cpp_simple_fun.res
new file mode 100644 (file)
index 0000000..802992c
--- /dev/null
@@ -0,0 +1 @@
+Hello world
diff --git a/tests/sav/test_ffi_cpp_strings.res b/tests/sav/test_ffi_cpp_strings.res
new file mode 100644 (file)
index 0000000..e61acab
--- /dev/null
@@ -0,0 +1,10 @@
+4
+3
+2
+1
+Vector is empty!
+1234
+3rd safe pop
+1234
+4th safe pop
+1234
diff --git a/tests/sav/test_ffi_cpp_types.res b/tests/sav/test_ffi_cpp_types.res
new file mode 100644 (file)
index 0000000..2240262
--- /dev/null
@@ -0,0 +1,4 @@
+4
+3
+2
+1
diff --git a/tests/test_ffi_cpp_callbacks.nit b/tests/test_ffi_cpp_callbacks.nit
new file mode 100644 (file)
index 0000000..e212c32
--- /dev/null
@@ -0,0 +1,71 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Module wrapping the C++ class vector<int>
+module test_ffi_cpp_callbacks
+
+in "C++ Header" `{
+       #include <vector>
+
+       using namespace std;
+`}
+
+# Nit class over C++'s vector<int>
+extern class CppVector in "C++" `{vector<int>*`}
+
+       # Extern constructor
+       new in "C++" `{
+               return new vector<int>();
+       `}
+
+       # Adds an element to the end of the vector
+       fun push(v: Int) in "C++" `{
+               recv->push_back(v);
+       `}
+
+       # Pops an element from the end of the vector
+       fun pop: Int in "C++" `{
+               long val = recv->back();
+               recv->pop_back();
+               return val;
+       `}
+
+       fun safe_pop_with_default(default_return: Int): Int import report_error in "C++" `{
+               if (recv->empty()) {
+                       CppVector_report_error(recv);
+                       return default_return;
+               } else {
+                       long val = recv->back();
+                       recv->pop_back();
+                       return val;
+               }
+       `}
+
+       private fun report_error do print "Vector is empty!"
+end
+
+var a = new CppVector
+a.push(1)
+a.push(2)
+a.push(3)
+a.push(4)
+print a.pop
+print a.pop
+print a.pop
+print a.safe_pop_with_default(1234)
+print a.safe_pop_with_default(1234)
+print a.safe_pop_with_default(1234)
+print a.safe_pop_with_default(1234)
diff --git a/tests/test_ffi_cpp_header.nit b/tests/test_ffi_cpp_header.nit
new file mode 100644 (file)
index 0000000..9dbe759
--- /dev/null
@@ -0,0 +1,47 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+module test_ffi_cpp_header
+
+in "C++" `{
+       #include <vector>
+
+       using namespace std;
+
+       vector<long> vec;
+`}
+
+class CppVector
+       fun push(v: Int) in "C++" `{
+               vec.push_back(v);
+       `}
+
+       fun pop: Int in "C++" `{
+               long val = vec.back();
+               vec.pop_back();
+               return val;
+       `}
+end
+
+var a = new CppVector
+a.push(1)
+a.push(2)
+a.push(3)
+a.push(4)
+print a.pop
+print a.pop
+print a.pop
+print a.pop
diff --git a/tests/test_ffi_cpp_simple_fun.nit b/tests/test_ffi_cpp_simple_fun.nit
new file mode 100644 (file)
index 0000000..9c0c5f4
--- /dev/null
@@ -0,0 +1,26 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+module test_ffi_cpp_simple_fun
+
+class A
+       fun foo in "C++" `{
+               std::cout << "Hello world\n";
+       `}
+end
+
+var a = new A
+a.foo
diff --git a/tests/test_ffi_cpp_strings.nit b/tests/test_ffi_cpp_strings.nit
new file mode 100644 (file)
index 0000000..5b6c59f
--- /dev/null
@@ -0,0 +1,88 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Module wrapping the C++ class vector<int>
+module test_ffi_cpp_strings
+
+import cpp # gives us String.to_cpp_string and the CppString class
+
+in "C++ Header" `{
+       #include <vector>
+
+       using namespace std;
+`}
+
+# Nit class over C++'s vector<int>
+extern class CppVector in "C++" `{vector<int>*`}
+
+       # Extern constructor
+       new in "C++" `{
+               return new vector<int>();
+       `}
+
+       # Adds an element to the end of the vector
+       fun push(v: Int) in "C++" `{
+               recv->push_back(v);
+       `}
+
+       # Pops an element from the end of the vector
+       fun pop: Int in "C++" `{
+               long val = recv->back();
+               recv->pop_back();
+               return val;
+       `}
+
+       # Uses a callback to report when receiver is empty
+       fun safe_pop_with_default(default_return: Int): Int import report_error in "C++" `{
+               if (recv->empty()) {
+                       CppVector_report_error(recv);
+                       return default_return;
+               } else {
+                       long val = recv->back();
+                       recv->pop_back();
+                       return val;
+               }
+       `}
+
+       # Callback for `safe_pop_with_default`
+       private fun report_error do print "Vector is empty!"
+
+       # Prints the given string when receiver is empty
+       fun safe_pop_with_custom_error(default_return: Int, error_msg: String): Int import String.to_cpp_string in "C++" `{
+               if (recv->empty()) {
+                       string *cpp_error_msg = String_to_cpp_string(error_msg);
+                       cout << *cpp_error_msg << "\n";
+                       return default_return;
+               } else {
+                       long val = recv->back();
+                       recv->pop_back();
+                       return val;
+               }
+       `}
+end
+
+var a = new CppVector
+a.push(1)
+a.push(2)
+a.push(3)
+a.push(4)
+print a.pop
+print a.pop
+print a.pop
+print a.safe_pop_with_default(1234)
+print a.safe_pop_with_default(1234)
+print a.safe_pop_with_custom_error(1234, "3rd safe pop")
+print a.safe_pop_with_custom_error(1234, "4th safe pop")
diff --git a/tests/test_ffi_cpp_types.nit b/tests/test_ffi_cpp_types.nit
new file mode 100644 (file)
index 0000000..6cdd3f5
--- /dev/null
@@ -0,0 +1,55 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Module wrapping the C++ class vector<int>
+module test_ffi_cpp_types
+
+in "C++ Header" `{
+       #include <vector>
+
+       using namespace std;
+`}
+
+# Nit class over C++'s vector<int>
+extern class CppVector in "C++" `{vector<int>*`}
+
+       # Extern constructor
+       new in "C++" `{
+               return new vector<int>();
+       `}
+
+       # Adds an element to the end of the vector
+       fun push(v: Int) in "C++" `{
+               recv->push_back(v);
+       `}
+
+       # Pops an element from the end of the vector
+       fun pop: Int in "C++" `{
+               long val = recv->back();
+               recv->pop_back();
+               return val;
+       `}
+end
+
+var a = new CppVector
+a.push(1)
+a.push(2)
+a.push(3)
+a.push(4)
+print a.pop
+print a.pop
+print a.pop
+print a.pop