Skip to content

Commit fd4272a

Browse files
committed
Multivalue reference tests
1 parent 73ff499 commit fd4272a

File tree

3 files changed

+191
-26
lines changed

3 files changed

+191
-26
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<sv:node xmlns:crx="http://www.day.com/crx/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fn_old="http://www.w3.org/2004/10/xpath-functions" xmlns:vlt="http://www.day.com/jcr/vault/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:rep="internal" sv:name="tests_mixinreferencable">
3+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
4+
<sv:value>nt:unstructured</sv:value>
5+
</sv:property>
6+
<sv:property sv:name="jcr:created" sv:type="Date">
7+
<sv:value>2009-04-27T13:00:54.082+02:00</sv:value>
8+
</sv:property>
9+
10+
<sv:node sv:name="testReferenceOnNonReferenceableNode">
11+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
12+
<sv:value>nt:unstructured</sv:value>
13+
</sv:property>
14+
<sv:node sv:name="non-referenceable">
15+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
16+
<sv:value>nt:unstructured</sv:value>
17+
</sv:property>
18+
</sv:node>
19+
<sv:node sv:name="node">
20+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
21+
<sv:value>nt:unstructured</sv:value>
22+
</sv:property>
23+
</sv:node>
24+
</sv:node>
25+
26+
<sv:node sv:name="testReferenceOnNewlyReferenceableNode">
27+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
28+
<sv:value>nt:unstructured</sv:value>
29+
</sv:property>
30+
31+
<sv:node sv:name="other-node">
32+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
33+
<sv:value>nt:unstructured</sv:value>
34+
</sv:property>
35+
</sv:node>
36+
<sv:node sv:name="node">
37+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
38+
<sv:value>nt:unstructured</sv:value>
39+
</sv:property>
40+
</sv:node>
41+
</sv:node>
42+
43+
<sv:node sv:name="testReferenceOnReferenceableNode">
44+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
45+
<sv:value>nt:unstructured</sv:value>
46+
</sv:property>
47+
48+
<sv:node sv:name="referenceable">
49+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
50+
<sv:value>nt:unstructured</sv:value>
51+
</sv:property>
52+
<sv:property sv:name="jcr:mixinTypes" sv:type="Name">
53+
<sv:value>mix:referenceable</sv:value>
54+
</sv:property>
55+
<sv:property sv:name="jcr:uuid" sv:type="String">
56+
<sv:value>842e61c0-09ab-42a9-87c0-308ccc90e6f4</sv:value>
57+
</sv:property>
58+
</sv:node>
59+
<sv:node sv:name="node">
60+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
61+
<sv:value>nt:unstructured</sv:value>
62+
</sv:property>
63+
</sv:node>
64+
</sv:node>
65+
66+
<sv:node sv:name="testUpdateReference">
67+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
68+
<sv:value>nt:unstructured</sv:value>
69+
</sv:property>
70+
71+
<sv:node sv:name="referenceable">
72+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
73+
<sv:value>nt:unstructured</sv:value>
74+
</sv:property>
75+
<sv:property sv:name="jcr:mixinTypes" sv:type="Name">
76+
<sv:value>mix:referenceable</sv:value>
77+
</sv:property>
78+
<sv:property sv:name="jcr:uuid" sv:type="String">
79+
<sv:value>242e61c0-09ab-42a9-82c0-398cc690e6f4</sv:value>
80+
</sv:property>
81+
</sv:node>
82+
<sv:node sv:name="node">
83+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
84+
<sv:value>nt:unstructured</sv:value>
85+
</sv:property>
86+
</sv:node>
87+
<sv:node sv:name="other-node">
88+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
89+
<sv:value>nt:unstructured</sv:value>
90+
</sv:property>
91+
</sv:node>
92+
</sv:node>
93+
94+
<sv:node sv:name="testMultiValueReference">
95+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
96+
<sv:value>nt:unstructured</sv:value>
97+
</sv:property>
98+
</sv:node>
99+
100+
<sv:node sv:name="testMultiValueWeakReference">
101+
<sv:property sv:name="jcr:primaryType" sv:type="Name">
102+
<sv:value>nt:unstructured</sv:value>
103+
</sv:property>
104+
</sv:node>
105+
</sv:node>
106+
Lines changed: 83 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<?php
22
namespace PHPCR\Tests\Writing;
33

4+
use PHPCR\PropertyType;
5+
46
require_once(__DIR__ . '/../../inc/BaseCase.php');
57

68
/**
@@ -10,8 +12,14 @@
1012
*/
1113
class MixinReferenceableTest extends \PHPCR\Test\BaseCase
1214
{
15+
public static function setupBeforeClass($fixtures = '10_Writing/mixinreferenceable')
16+
{
17+
parent::setupBeforeClass($fixtures);
18+
}
19+
1320
public function setUp()
1421
{
22+
parent::setUp();
1523
$this->renewSession(); // discard changes
1624
}
1725

@@ -22,11 +30,11 @@ public function setUp()
2230
public function testReferenceOnNonReferenceableNode()
2331
{
2432
// Load a non-referenceable node
25-
$referenced_node = $this->session->getNode('/tests_general_base/emptyExample');
33+
$nonReferenceableNode = $this->node->getNode('non-referenceable');
2634

2735
// 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);
3038
$this->session->save();
3139
}
3240

@@ -36,24 +44,24 @@ public function testReferenceOnNonReferenceableNode()
3644
public function testReferenceOnNewlyReferenceableNode()
3745
{
3846
// 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');
4149

4250
// Re-read the node to be sure it has a UUID
4351
$this->saveAndRenewSession();
44-
$referenced_node = $this->session->getNode('/tests_general_base/emptyExample');
52+
$referencedNode = $this->node->getNode('node');
4553

4654
// 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);
4957

5058
$this->session->save();
5159

52-
$this->assertInstanceOf('PHPCR\NodeInterface', $source_node->getPropertyValue('reference'));
60+
$this->assertInstanceOf('PHPCR\NodeInterface', $sourceNode->getPropertyValue('reference'));
5361

5462
// 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());
5765
}
5866

5967
/**
@@ -62,39 +70,90 @@ public function testReferenceOnNewlyReferenceableNode()
6270
public function testReferenceOnReferenceableNode()
6371
{
6472
// Load a referenceable node
65-
$referenced_node = $this->session->getNode('/tests_general_base/idExample');
73+
$referencedNode = $this->node->getNode('referenceable');
6674

6775
// 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);
7078
$this->session->save();
7179

72-
$this->assertInstanceOf('PHPCR\NodeInterface', $source_node->getPropertyValue('oreference'));
80+
$this->assertInstanceOf('PHPCR\NodeInterface', $sourceNode->getPropertyValue('oreference'));
7381
}
7482

7583
/**
7684
* Test that we can update a reference
7785
*/
7886
public function testUpdateReference()
7987
{
80-
$referenced1 = $this->session->getNode('/tests_general_base/emptyExample');
88+
$referenced1 = $this->node->getNode('node');
8189
$referenced1->addMixin('mix:referenceable');
8290
$this->session->save();
8391

8492
// Load a referenceable node
85-
$referenced2 = $this->session->getNode('/tests_general_base/idExample');
93+
$referenced2 = $this->node->getNode('referenceable');
8694

8795
// 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');
97+
98+
$sourceNode->setProperty('reference', $referenced1, \PHPCR\PropertyType::WEAKREFERENCE);
99+
$this->session->save();
100+
$sourceNode->setProperty('reference', $referenced2, \PHPCR\PropertyType::WEAKREFERENCE);
101+
$this->session->save();
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 testMultiValueReference()
110+
{
111+
$this->doTestMultiValueReference(
112+
array('one', 'two', 'three'),
113+
array('one', 'two', 'one', 'one', 'two', 'three'),
114+
PropertyType::REFERENCE
115+
);
116+
}
117+
118+
public function testMultiValueWeakReference()
119+
{
120+
$this->doTestMultiValueReference(
121+
array('one', 'two', 'three'),
122+
array('one', 'two', 'one', 'one', 'two', 'three'),
123+
PropertyType::WEAKREFERENCE
124+
);
125+
}
126+
127+
private function doTestMultiValueReference($nodeNames, $nodeCollectionNames, $referenceType)
128+
{
129+
$baseNode = $this->node;
130+
$nodes = array();
131+
foreach ($nodeNames as $nodeName) {
132+
$node = $baseNode->addNode($nodeName);
133+
$node->addMixin('mix:referenceable');
134+
$nodes[$nodeName] = $node;
135+
}
89136

90-
$source_node->setProperty('reference', $referenced1, \PHPCR\PropertyType::WEAKREFERENCE);
91137
$this->session->save();
92-
$source_node->setProperty('reference', $referenced2, \PHPCR\PropertyType::WEAKREFERENCE);
138+
139+
$referrer = $baseNode->addNode('referrer');
140+
141+
$nodeCollection = array();
142+
143+
foreach ($nodeCollectionNames as $nodeCollectionName) {
144+
$nodeCollection[] = $nodes[$nodeCollectionName];
145+
}
146+
$referrer->setProperty('references', $nodeCollection, $referenceType);
147+
93148
$this->session->save();
94-
$this->assertSame($referenced2, $source_node->getPropertyValue('reference'));
95149

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());
150+
$this->renewSession();
151+
$referrer = $this->node->getNode('referrer');
152+
$values = $referrer->getProperty('references');
153+
154+
foreach ($values as $referencedNode) {
155+
$name = array_shift($nodeCollectionNames);
156+
$this->assertSame($name, $referencedNode->getName());
157+
}
99158
}
100159
}

tests/10_Writing/SetPropertyMethodsTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ public function testSetPropertyNewWithType()
146146

147147
public function testSetPropertyMultivalue()
148148
{
149-
$prop = $this->node->setProperty('multivalue', array(1, 2, 3));
150-
$this->assertEquals(array(1,2,3), $this->node->getPropertyValue('multivalue'));
149+
$prop = $this->node->setProperty('multivalue', array(1, 2, 3, 1));
150+
$this->assertEquals(array(1,2,3, 1), $this->node->getPropertyValue('multivalue'));
151151
$this->assertEquals(\PHPCR\PropertyType::LONG, $prop->getType());
152152
$this->assertTrue($prop->isMultiple());
153153

0 commit comments

Comments
 (0)