mirror of https://github.com/mono/CppSharp.git
6 changed files with 334 additions and 0 deletions
@ -0,0 +1,31 @@
@@ -0,0 +1,31 @@
|
||||
top_srcdir = ../ |
||||
|
||||
INTEROP_DLL = \
|
||||
$(top_srcdir)/src/Mono.VisualC.Interop/bin/Debug/Mono.VisualC.Interop.dll |
||||
|
||||
all: test.exe |
||||
|
||||
test.xml: test.h |
||||
gccxml -fxml=$@ --gccxml-cxxflags -c test.h |
||||
|
||||
libTest.so: test.h test.cpp |
||||
g++ -fPIC --shared -o $@ test.cpp |
||||
|
||||
libTest-inline.so: test.h test.cpp |
||||
g++ -fPIC --shared -fkeep-inline-functions -o $@ test.cpp |
||||
|
||||
generated: test.xml |
||||
$(RM) -r generated |
||||
mono --debug $(top_srcdir)/src/generator2/bin/Debug/generator.exe -o=generated -ns=CppTests -lib=Test test.xml |
||||
|
||||
CppTestBinding.dll: generated |
||||
mcs -out:$@ -target:library -unsafe -r:$(INTEROP_DLL) generated/*.cs |
||||
|
||||
test.exe: test.cs TestDriver.cs CppTestBinding.dll libTest.so libTest-inline.so |
||||
mcs -out:$@ -target:exe -r:$(INTEROP_DLL) -r:CppTestBinding.dll test.cs TestDriver.cs |
||||
|
||||
clean: |
||||
$(RM) -rf CppTestBinding.dll test.exe generated libTest.so libTest-inline.so test.xml |
||||
|
||||
run: test.exe |
||||
MONO_PATH=$(top_srcdir)/src/Mono.VisualC.Interop/bin/Debug mono test.exe |
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
This directory contains tests for the cpp binding. It should probably be merged with |
||||
src/Tests. To run them, type 'make run'. |
||||
|
@ -0,0 +1,125 @@
@@ -0,0 +1,125 @@
|
||||
using System; |
||||
using System.Reflection; |
||||
using System.Collections.Generic; |
||||
|
||||
public class CategoryAttribute : Attribute |
||||
{ |
||||
public CategoryAttribute (string category) { |
||||
Category = category; |
||||
} |
||||
|
||||
public string Category { |
||||
get; set; |
||||
} |
||||
} |
||||
|
||||
public class TestDriver { |
||||
|
||||
static public int RunTests (Type type, string[] args) { |
||||
int failed = 0, ran = 0; |
||||
int result, expected; |
||||
int i, j, iterations; |
||||
string name; |
||||
MethodInfo[] methods; |
||||
bool do_timings = false; |
||||
bool verbose = false; |
||||
int tms = 0; |
||||
DateTime start, end = DateTime.Now; |
||||
|
||||
iterations = 1; |
||||
|
||||
var exclude = new Dictionary<string, string> (); |
||||
List<string> run_only = new List<string> (); |
||||
if (args != null && args.Length > 0) { |
||||
for (j = 0; j < args.Length;) { |
||||
if (args [j] == "--time") { |
||||
do_timings = true; |
||||
j ++; |
||||
} else if (args [j] == "--iter") { |
||||
iterations = Int32.Parse (args [j + 1]); |
||||
j += 2; |
||||
} else if ((args [j] == "-v") || (args [j] == "--verbose")) { |
||||
verbose = true; |
||||
} else if (args [j] == "--exclude") { |
||||
exclude [args [j + 1]] = args [j + 1]; |
||||
j += 2; |
||||
} else if (args [j] == "--run-only") { |
||||
run_only.Add (args [j + 1]); |
||||
j += 2; |
||||
} else { |
||||
Console.WriteLine ("Unknown argument: " + args [j]); |
||||
return 1; |
||||
} |
||||
} |
||||
} |
||||
int nskipped = 0; |
||||
methods = type.GetMethods (BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static); |
||||
for (int iter = 0; iter < iterations; ++iter) { |
||||
for (i = 0; i < methods.Length; ++i) { |
||||
name = methods [i].Name; |
||||
if (!name.StartsWith ("test_", StringComparison.Ordinal)) |
||||
continue; |
||||
if (run_only.Count > 0) { |
||||
bool found = false; |
||||
for (j = 0; j < run_only.Count; j++) { |
||||
if (name.EndsWith (run_only [j])) { |
||||
found = true; |
||||
break; |
||||
} |
||||
} |
||||
if (!found) |
||||
continue; |
||||
} |
||||
if (exclude.Count > 0) { |
||||
var attrs = methods [i].GetCustomAttributes (typeof (CategoryAttribute), false); |
||||
bool skip = false; |
||||
foreach (CategoryAttribute attr in attrs) { |
||||
if (exclude.ContainsKey (attr.Category)) |
||||
skip = true; |
||||
} |
||||
if (skip) { |
||||
if (verbose) |
||||
Console.WriteLine ("Skipping '{0}'.", name); |
||||
nskipped ++; |
||||
continue; |
||||
} |
||||
} |
||||
for (j = 5; j < name.Length; ++j) |
||||
if (!Char.IsDigit (name [j])) |
||||
break; |
||||
if (verbose) |
||||
Console.WriteLine ("Running '{0}' ...", name); |
||||
expected = Int32.Parse (name.Substring (5, j - 5)); |
||||
start = DateTime.Now; |
||||
result = (int)methods [i].Invoke (null, null); |
||||
if (do_timings) { |
||||
end = DateTime.Now; |
||||
long tdiff = end.Ticks - start.Ticks; |
||||
int mdiff = (int)tdiff/10000; |
||||
tms += mdiff; |
||||
Console.WriteLine ("{0} took {1} ms", name, mdiff); |
||||
} |
||||
ran++; |
||||
if (result != expected) { |
||||
failed++; |
||||
Console.WriteLine ("{0} failed: got {1}, expected {2}", name, result, expected); |
||||
} |
||||
} |
||||
|
||||
if (do_timings) { |
||||
Console.WriteLine ("Total ms: {0}", tms); |
||||
} |
||||
if (nskipped > 0) |
||||
Console.WriteLine ("Regression tests: {0} ran, {1} skipped, {2} failed in {3}", ran, nskipped, failed, type); |
||||
else |
||||
Console.WriteLine ("Regression tests: {0} ran, {1} failed in {2}", ran, failed, type); |
||||
} |
||||
|
||||
//Console.WriteLine ("Regression tests: {0} ran, {1} failed in [{2}]{3}", ran, failed, type.Assembly.GetName().Name, type);
|
||||
return failed; |
||||
} |
||||
static public int RunTests (Type type) { |
||||
return RunTests (type, null); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,36 @@
@@ -0,0 +1,36 @@
|
||||
|
||||
#include "test.h" |
||||
|
||||
ClassWithCopyCtor::ClassWithCopyCtor(const ClassWithCopyCtor& f) { |
||||
x = f.x; |
||||
} |
||||
|
||||
ClassWithCopyCtor |
||||
ClassWithCopyCtor::Return (int x) { |
||||
return ClassWithCopyCtor (x); |
||||
} |
||||
|
||||
int |
||||
ClassWithCopyCtor::GetX () { |
||||
return x; |
||||
} |
||||
|
||||
ClassWithDtor |
||||
ClassWithDtor::Return (int x) { |
||||
return ClassWithDtor (x); |
||||
} |
||||
|
||||
int |
||||
ClassWithDtor::GetX () { |
||||
return x; |
||||
} |
||||
|
||||
ClassWithoutCopyCtor |
||||
ClassWithoutCopyCtor::Return (int x) { |
||||
return ClassWithoutCopyCtor (x); |
||||
} |
||||
|
||||
int |
||||
ClassWithoutCopyCtor::GetX () { |
||||
return x; |
||||
} |
@ -0,0 +1,66 @@
@@ -0,0 +1,66 @@
|
||||
using System; |
||||
using CppTests; |
||||
|
||||
public class Tests |
||||
{ |
||||
public static void Main (String[] args) { |
||||
TestDriver.RunTests (typeof (Tests), args); |
||||
} |
||||
|
||||
public static int test_0_class_return () { |
||||
// Section 3.1.4:
|
||||
// Classes with non-default copy ctors/destructors are returned using a hidden
|
||||
// argument
|
||||
var c = ClassWithCopyCtor.Return (42); |
||||
if (c.GetX () != 42) |
||||
return 1; |
||||
|
||||
var c2 = ClassWithDtor.Return (43); |
||||
if (c2.GetX () != 43) |
||||
return 2; |
||||
|
||||
// This class is returned normally
|
||||
var c3 = ClassWithoutCopyCtor.Return (44); |
||||
if (c3.GetX () != 44) |
||||
return 3; |
||||
return 0; |
||||
} |
||||
|
||||
// An object as ref argument
|
||||
public static int test_0_class_arg () { |
||||
var c1 = new Class (4); |
||||
var c2 = new Class (5); |
||||
|
||||
c1.CopyTo (c2); |
||||
return c2.GetX () == 4 ? 0 : 1; |
||||
} |
||||
|
||||
// A null object as ref argument
|
||||
public static int test_0_class_arg_null () { |
||||
var c1 = new Class (4); |
||||
|
||||
return c1.IsNull (null) ? 0 : 1; |
||||
} |
||||
|
||||
// An object as byval argument
|
||||
public static int test_0_class_arg_byval () { |
||||
var c1 = new Class (4); |
||||
var c2 = new Class (5); |
||||
|
||||
c1.CopyFromValue (c2); |
||||
return c1.GetX () == 5 ? 0 : 1; |
||||
} |
||||
|
||||
// A null object as byval argument
|
||||
public static int test_0_class_arg_byval_null () { |
||||
var c1 = new Class (4); |
||||
|
||||
try { |
||||
c1.CopyFromValue (null); |
||||
} catch (ArgumentException) { |
||||
return 0; |
||||
} |
||||
return 1; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
|
||||
class ClassWithCopyCtor { |
||||
int x; |
||||
|
||||
public: |
||||
ClassWithCopyCtor(int xarg) { |
||||
x = xarg; |
||||
} |
||||
|
||||
ClassWithCopyCtor(const ClassWithCopyCtor& f); |
||||
|
||||
static ClassWithCopyCtor Return (int x); |
||||
|
||||
int GetX (); |
||||
}; |
||||
|
||||
class ClassWithDtor { |
||||
int x; |
||||
|
||||
public: |
||||
ClassWithDtor(int xarg) { |
||||
x = xarg; |
||||
} |
||||
|
||||
~ClassWithDtor () { |
||||
} |
||||
|
||||
static ClassWithDtor Return (int x); |
||||
|
||||
int GetX (); |
||||
}; |
||||
|
||||
|
||||
class ClassWithoutCopyCtor { |
||||
int x; |
||||
|
||||
public: |
||||
ClassWithoutCopyCtor(int xarg) { |
||||
x = xarg; |
||||
} |
||||
|
||||
static ClassWithoutCopyCtor Return (int x); |
||||
|
||||
int GetX (); |
||||
}; |
||||
|
||||
class Class { |
||||
int x; |
||||
|
||||
public: |
||||
Class (int xarg) { |
||||
x = xarg; |
||||
} |
||||
|
||||
void CopyFromValue (Class c) { |
||||
x = c.x; |
||||
} |
||||
|
||||
void CopyTo (Class *c) { |
||||
c->x = x; |
||||
} |
||||
|
||||
bool IsNull (Class *c) { |
||||
return !c ? true : false; |
||||
} |
||||
|
||||
int GetX () { |
||||
return x; |
||||
} |
||||
}; |
||||
|
||||
|
||||
|
Loading…
Reference in new issue