summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/sol2/test_operators.cpp
blob: b8e48e783eeb40088c0b7870e53bb445c9a2e819 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#define SOL_CHECK_ARGUMENTS

#include <sol.hpp>
#include <catch.hpp>

TEST_CASE("operators/default", "test that generic equality operators and all sorts of equality tests can be used") {
	sol::state lua;
	lua.open_libraries(sol::lib::base);

	struct T {};
	struct U {
		int a;
		U(int x = 20) : a(x) {}
		bool operator==(const U& r) {
			return a == r.a;
		}
	};
	struct V {
		int a;
		V(int x = 20) : a(x) {}
		bool operator==(const V& r) const {
			return a == r.a;
		}
	};
	lua.new_usertype<T>("T");
	lua.new_usertype<U>("U");
	lua.new_usertype<V>("V");

	T t1;
	T& t2 = t1;
	T t3;
	U u1;
	U u2{ 30 };
	U u3;
	U v1;
	U v2{ 30 };
	U v3;
	lua["t1"] = &t1;
	lua["t2"] = &t2;
	lua["t3"] = &t3;
	lua["u1"] = &u1;
	lua["u2"] = &u2;
	lua["u3"] = &u3;
	lua["v1"] = &v1;
	lua["v2"] = &v2;
	lua["v3"] = &v3;

	// Can only compare identity here
	REQUIRE_NOTHROW({
		lua.script("assert(t1 == t1)");
		lua.script("assert(t2 == t2)");
		lua.script("assert(t3 == t3)");
	});
	REQUIRE_NOTHROW({
		lua.script("assert(t1 == t2)");
		lua.script("assert(not (t1 == t3))");
		lua.script("assert(not (t2 == t3))");
	});
	// Object should compare equal to themselves
	// (and not invoke operator==; pointer test should be sufficient)
	REQUIRE_NOTHROW({
		lua.script("assert(u1 == u1)");
		lua.script("assert(u2 == u2)");
		lua.script("assert(u3 == u3)");
	});
	REQUIRE_NOTHROW({
		lua.script("assert(not (u1 == u2))");
		lua.script("assert(u1 == u3)");
		lua.script("assert(not (u2 == u3))");
	});
	// Object should compare equal to themselves
	// (and not invoke operator==; pointer test should be sufficient)
	REQUIRE_NOTHROW({
		lua.script("assert(v1 == v1)");
		lua.script("assert(v2 == v2)");
		lua.script("assert(v3 == v3)");
	});
	REQUIRE_NOTHROW({
		lua.script("assert(not (v1 == v2))");
		lua.script("assert(v1 == v3)");
		lua.script("assert(not (v2 == v3))");
	});
}