1 #include "test.inc"
2 #include <see/see.h>
3 
4 void
test()5 test()
6 {
7 	struct SEE_interpreter interp_storage1, *interp1 = &interp_storage1;
8 	struct SEE_interpreter interp_storage2, *interp2 = &interp_storage2;
9 	struct SEE_string *gstr, *str1, *str2, *s;
10 
11 	TEST_DESCRIBE("bug 105, SEE_intern between interpreters");
12 
13 	/* Globally interning a string should return a string with no interp */
14 	gstr = SEE_intern_global("something");
15 	TEST_NULL(gstr->interpreter);
16 
17 	/* Re-interning the "something" should result in the same pointer */
18 	s = SEE_intern_global("something");
19 	TEST_EQ_PTR(s, gstr);
20 
21 	/* Construct two separate interpreter contexts */
22 	SEE_interpreter_init(interp1);
23 	SEE_interpreter_init(interp2);
24 
25 	/* Interning a string in interp #1 should result in a simple string */
26 	str1 = SEE_intern_ascii(interp1, "dispatchEvent");
27 	TEST_NOT_NULL(str1);
28 	TEST_EQ_PTR(str1->interpreter, interp1);
29 
30 	/* MAIN TEST: interning the string from interp1 into interp2
31 	 * should return a duplicated pointer that is local to interp2 */
32 	str2 = SEE_intern(interp2, str1);
33 	TEST_NOT_NULL(str2);
34 	TEST_NOT_EQ_PTR(str1, str2);
35 	TEST_EQ_STRING(str1, str2);
36 	TEST_EQ_PTR(str2->interpreter, interp2);
37 	TEST_EQ_PTR(str1->interpreter, interp1);
38 
39 	/* Re-interning the str1 in interp1 shouldn't change it */
40 	s = SEE_intern(interp1, str1);
41 	TEST_EQ_PTR(s, str1);
42 	TEST_EQ_PTR(s->interpreter, interp1);
43 
44 	/* Re-interning the str2 in interp2 shouldn't change it */
45 	s = SEE_intern(interp2, str2);
46 	TEST_EQ_PTR(s, str2);
47 	TEST_EQ_PTR(s->interpreter, interp2);
48 
49 	/* Re-interning str2 into interp1 should get str1! */
50 	s = SEE_intern(interp1, str2);
51 	TEST_EQ_PTR(s, str1);
52 
53 	/* Interning the global "something" should always result in gstr */
54 	s = SEE_intern(interp1, gstr);
55 	TEST_EQ_PTR(s, gstr);
56 	s = SEE_intern_ascii(interp1, "something");
57 	TEST_EQ_PTR(s, gstr);
58 	s = SEE_intern(interp2, gstr);
59 	TEST_EQ_PTR(s, gstr);
60 	s = SEE_intern_ascii(interp2, "something");
61 	TEST_EQ_PTR(s, gstr);
62 }
63