1
1
<?php
2
2
namespace PHPCR \Tests \Writing ;
3
3
4
+ use PHPCR \PropertyType ;
5
+
4
6
require_once (__DIR__ . '/../../inc/BaseCase.php ' );
5
7
6
8
/**
10
12
*/
11
13
class MixinReferenceableTest extends \PHPCR \Test \BaseCase
12
14
{
15
+ public static function setupBeforeClass ($ fixtures = '10_Writing/mixinreferenceable ' )
16
+ {
17
+ parent ::setupBeforeClass ($ fixtures );
18
+ }
19
+
13
20
public function setUp ()
14
21
{
22
+ parent ::setUp ();
15
23
$ this ->renewSession (); // discard changes
16
24
}
17
25
@@ -22,11 +30,11 @@ public function setUp()
22
30
public function testReferenceOnNonReferenceableNode ()
23
31
{
24
32
// Load a non-referenceable node
25
- $ referenced_node = $ this ->session ->getNode ('/tests_general_base/emptyExample ' );
33
+ $ nonReferenceableNode = $ this ->node ->getNode ('non-referenceable ' );
26
34
27
35
// Try to reference it
28
- $ source_node = $ this ->session ->getNode ('/tests_general_base/index.txt/jcr:content ' );
29
- $ source_node ->setProperty ('reference ' , $ referenced_node , \PHPCR \PropertyType::WEAKREFERENCE );
36
+ $ sourceNode = $ this ->node ->getNode ('node ' );
37
+ $ sourceNode ->setProperty ('reference ' , $ nonReferenceableNode , \PHPCR \PropertyType::WEAKREFERENCE );
30
38
$ this ->session ->save ();
31
39
}
32
40
@@ -36,24 +44,24 @@ public function testReferenceOnNonReferenceableNode()
36
44
public function testReferenceOnNewlyReferenceableNode ()
37
45
{
38
46
// Load a non-referenceable node and make it referenceable
39
- $ referenced_node = $ this ->session ->getNode ('/tests_general_base/emptyExample ' );
40
- $ referenced_node ->addMixin ('mix:referenceable ' );
47
+ $ referencedNode = $ this ->node ->getNode ('node ' );
48
+ $ referencedNode ->addMixin ('mix:referenceable ' );
41
49
42
50
// Re-read the node to be sure it has a UUID
43
51
$ this ->saveAndRenewSession ();
44
- $ referenced_node = $ this ->session ->getNode ('/tests_general_base/emptyExample ' );
52
+ $ referencedNode = $ this ->node ->getNode ('node ' );
45
53
46
54
// Reference it from another node
47
- $ source_node = $ this ->session ->getNode ('/tests_general_base/index.txt/jcr:content ' );
48
- $ source_node ->setProperty ('reference ' , $ referenced_node , \PHPCR \PropertyType::WEAKREFERENCE );
55
+ $ sourceNode = $ this ->node ->getNode ('other-node ' );
56
+ $ sourceNode ->setProperty ('reference ' , $ referencedNode , \PHPCR \PropertyType::WEAKREFERENCE );
49
57
50
58
$ this ->session ->save ();
51
59
52
- $ this ->assertInstanceOf ('PHPCR\NodeInterface ' , $ source_node ->getPropertyValue ('reference ' ));
60
+ $ this ->assertInstanceOf ('PHPCR\NodeInterface ' , $ sourceNode ->getPropertyValue ('reference ' ));
53
61
54
62
// referrers only required to work once save happened
55
- $ this ->assertCount (0 , $ referenced_node ->getReferences ());
56
- $ this ->assertCount (1 , $ referenced_node ->getWeakReferences ());
63
+ $ this ->assertCount (0 , $ referencedNode ->getReferences ());
64
+ $ this ->assertCount (1 , $ referencedNode ->getWeakReferences ());
57
65
}
58
66
59
67
/**
@@ -62,39 +70,108 @@ public function testReferenceOnNewlyReferenceableNode()
62
70
public function testReferenceOnReferenceableNode ()
63
71
{
64
72
// Load a referenceable node
65
- $ referenced_node = $ this ->session ->getNode ('/tests_general_base/idExample ' );
73
+ $ referencedNode = $ this ->node ->getNode ('referenceable ' );
66
74
67
75
// Reference it from another node
68
- $ source_node = $ this ->session ->getNode ('/tests_general_base/index.txt/jcr:content ' );
69
- $ source_node ->setProperty ('oreference ' , $ referenced_node , \PHPCR \PropertyType::WEAKREFERENCE );
76
+ $ sourceNode = $ this ->node ->getNode ('node ' );
77
+ $ sourceNode ->setProperty ('oreference ' , $ referencedNode , \PHPCR \PropertyType::WEAKREFERENCE );
70
78
$ this ->session ->save ();
71
79
72
- $ this ->assertInstanceOf ('PHPCR\NodeInterface ' , $ source_node ->getPropertyValue ('oreference ' ));
80
+ $ this ->assertInstanceOf ('PHPCR\NodeInterface ' , $ sourceNode ->getPropertyValue ('oreference ' ));
73
81
}
74
82
75
83
/**
76
84
* Test that we can update a reference
77
85
*/
78
86
public function testUpdateReference ()
79
87
{
80
- $ referenced1 = $ this ->session ->getNode ('/tests_general_base/emptyExample ' );
88
+ $ referenced1 = $ this ->node ->getNode ('node ' );
81
89
$ referenced1 ->addMixin ('mix:referenceable ' );
82
90
$ this ->session ->save ();
83
91
84
92
// Load a referenceable node
85
- $ referenced2 = $ this ->session ->getNode ('/tests_general_base/idExample ' );
93
+ $ referenced2 = $ this ->node ->getNode ('referenceable ' );
86
94
87
95
// Reference it from another node
88
- $ source_node = $ this ->session ->getNode ('/tests_general_base/index.txt/jcr:content ' );
96
+ $ sourceNode = $ this ->node ->getNode ('other-node ' );
89
97
90
- $ source_node ->setProperty ('reference ' , $ referenced1 , \PHPCR \PropertyType::WEAKREFERENCE );
98
+ $ sourceNode ->setProperty ('reference ' , $ referenced1 , \PHPCR \PropertyType::WEAKREFERENCE );
91
99
$ this ->session ->save ();
92
- $ source_node ->setProperty ('reference ' , $ referenced2 , \PHPCR \PropertyType::WEAKREFERENCE );
100
+ $ sourceNode ->setProperty ('reference ' , $ referenced2 , \PHPCR \PropertyType::WEAKREFERENCE );
93
101
$ this ->session ->save ();
94
- $ this ->assertSame ($ referenced2 , $ source_node ->getPropertyValue ('reference ' ));
102
+ $ this ->assertSame ($ referenced2 , $ sourceNode ->getPropertyValue ('reference ' ));
103
+
104
+ $ this ->renewSession ();
105
+ $ referenced2 = $ this ->node ->getNode ('referenceable ' );
106
+ $ this ->assertSame ($ referenced2 , $ this ->node ->getNode ('other-node ' )->getProperty ('reference ' )->getValue ());
107
+ }
108
+
109
+ public function provideMultiValueReference ()
110
+ {
111
+ return array (
112
+ array (
113
+ array ('one ' , 'two ' , 'three ' ),
114
+ array ('one ' , 'two ' , 'one ' , 'one ' , 'two ' , 'three ' ),
115
+ PropertyType::REFERENCE
116
+ ),
117
+ array (
118
+ ),
119
+ array (
120
+ array ('one ' ),
121
+ array ('one ' ),
122
+ PropertyType::WEAKREFERENCE
123
+ ),
124
+ );
125
+ }
126
+
127
+ public function testMultiValueReference ()
128
+ {
129
+ $ this ->doTestMultiValueReference (
130
+ array ('one ' , 'two ' , 'three ' ),
131
+ array ('one ' , 'two ' , 'one ' , 'one ' , 'two ' , 'three ' ),
132
+ PropertyType::REFERENCE
133
+ );
134
+ }
135
+
136
+ public function testMultiValueWeakReference ()
137
+ {
138
+ $ this ->doTestMultiValueReference (
139
+ array ('one ' , 'two ' , 'three ' ),
140
+ array ('one ' , 'two ' , 'one ' , 'one ' , 'two ' , 'three ' ),
141
+ PropertyType::WEAKREFERENCE
142
+ );
143
+ }
144
+
145
+ private function doTestMultiValueReference ($ nodeNames , $ nodeCollectionNames , $ referenceType )
146
+ {
147
+ $ baseNode = $ this ->node ;
148
+ $ nodes = array ();
149
+ foreach ($ nodeNames as $ nodeName ) {
150
+ $ node = $ baseNode ->addNode ($ nodeName );
151
+ $ node ->addMixin ('mix:referenceable ' );
152
+ $ nodes [$ nodeName ] = $ node ;
153
+ }
154
+
155
+ $ this ->session ->save ();
156
+
157
+ $ referrer = $ baseNode ->addNode ('referrer ' );
158
+
159
+ $ nodeCollection = array ();
160
+
161
+ foreach ($ nodeCollectionNames as $ nodeCollectionName ) {
162
+ $ nodeCollection [] = $ nodes [$ nodeCollectionName ];
163
+ }
164
+ $ referrer ->setProperty ('references ' , $ nodeCollection , $ referenceType );
165
+
166
+ $ this ->session ->save ();
167
+
168
+ $ this ->renewSession ();
169
+ $ referrer = $ this ->node ->getNode ('referrer ' );
170
+ $ values = $ referrer ->getProperty ('references ' );
95
171
96
- $ session = $ this ->renewSession ();
97
- $ referenced2 = $ session ->getNode ('/tests_general_base/idExample ' );
98
- $ this ->assertSame ($ referenced2 , $ session ->getProperty ('/tests_general_base/index.txt/jcr:content/reference ' )->getValue ());
172
+ foreach ($ values as $ referencedNode ) {
173
+ $ name = array_shift ($ nodeCollectionNames );
174
+ $ this ->assertSame ($ name , $ referencedNode ->getName ());
175
+ }
99
176
}
100
177
}
0 commit comments