Skip to content

Commit cd0ea65

Browse files
committed
Fix some tests related to access order and make sorting explicit
1 parent f82ad6f commit cd0ea65

File tree

5 files changed

+33
-19
lines changed

5 files changed

+33
-19
lines changed

src/JMS/Serializer/Metadata/ClassMetadata.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -266,12 +266,13 @@ private function sortProperties()
266266

267267
case self::ACCESSOR_ORDER_CUSTOM:
268268
$order = $this->customOrder;
269-
uksort($this->propertyMetadata, function($a, $b) use ($order) {
269+
$currentSorting = $this->propertyMetadata ? array_combine(array_keys($this->propertyMetadata), range(1, count($this->propertyMetadata))) : [];
270+
uksort($this->propertyMetadata, function($a, $b) use ($order, $currentSorting) {
270271
$existsA = isset($order[$a]);
271272
$existsB = isset($order[$b]);
272273

273274
if ( ! $existsA && ! $existsB) {
274-
return 0;
275+
return $currentSorting[$a] - $currentSorting[$b];
275276
}
276277

277278
if ( ! $existsA) {

tests/JMS/Serializer/Tests/Metadata/ClassMetadataTest.php

+27-14
Original file line numberDiff line numberDiff line change
@@ -23,30 +23,43 @@
2323

2424
class ClassMetadataTest extends \PHPUnit_Framework_TestCase
2525
{
26-
public function testSetAccessorOrder()
26+
public function getAccessOrderCases()
27+
{
28+
return [
29+
[array('b', 'a'), array('b', 'a')],
30+
[array('a', 'b'), array('a', 'b')],
31+
[array('b'), array('b', 'a')],
32+
[array('a'), array('a', 'b')],
33+
[array('foo', 'bar'), array('b', 'a')],
34+
];
35+
}
36+
37+
/**
38+
* @dataProvider getAccessOrderCases
39+
*/
40+
public function testSetAccessorOrderCustom(array $order, array $expected)
2741
{
2842
$metadata = new ClassMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder');
2943
$metadata->addPropertyMetadata(new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'b'));
3044
$metadata->addPropertyMetadata(new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'a'));
3145
$this->assertEquals(array('b', 'a'), array_keys($metadata->propertyMetadata));
3246

33-
$metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_ALPHABETICAL);
34-
$this->assertEquals(array('a', 'b'), array_keys($metadata->propertyMetadata));
35-
36-
$metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, array('b', 'a'));
37-
$this->assertEquals(array('b', 'a'), array_keys($metadata->propertyMetadata));
38-
39-
$metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, array('a', 'b'));
40-
$this->assertEquals(array('a', 'b'), array_keys($metadata->propertyMetadata));
47+
$metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, $order);
48+
$this->assertEquals($expected, array_keys($metadata->propertyMetadata));
49+
}
4150

42-
$metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, array('b'));
51+
/**
52+
* @dataProvider getAccessOrderCases
53+
*/
54+
public function testSetAccessorOrderAlphabetical()
55+
{
56+
$metadata = new ClassMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder');
57+
$metadata->addPropertyMetadata(new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'b'));
58+
$metadata->addPropertyMetadata(new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'a'));
4359
$this->assertEquals(array('b', 'a'), array_keys($metadata->propertyMetadata));
4460

45-
$metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, array('a'));
61+
$metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_ALPHABETICAL);
4662
$this->assertEquals(array('a', 'b'), array_keys($metadata->propertyMetadata));
47-
48-
$metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, array('foo', 'bar'));
49-
$this->assertEquals(array('b', 'a'), array_keys($metadata->propertyMetadata));
5063
}
5164

5265
/**

tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ protected function getContent($key)
7777
$outputs['groups_foo'] = '{"foo":"foo","foobar":"foobar"}';
7878
$outputs['groups_foobar'] = '{"foo":"foo","foobar":"foobar","bar":"bar"}';
7979
$outputs['groups_default'] = '{"bar":"bar","none":"none"}';
80-
$outputs['virtual_properties'] = '{"exist_field":"value","test":"other-name","virtual_value":"value","typed_virtual_property":1}';
80+
$outputs['virtual_properties'] = '{"exist_field":"value","virtual_value":"value","test":"other-name","typed_virtual_property":1}';
8181
$outputs['virtual_properties_low'] = '{"low":1}';
8282
$outputs['virtual_properties_high'] = '{"high":8}';
8383
$outputs['virtual_properties_all'] = '{"low":1,"high":8}';
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<result>
33
<exist_field><![CDATA[value]]></exist_field>
4-
<test><![CDATA[other-name]]></test>
54
<virtual_value><![CDATA[value]]></virtual_value>
5+
<test><![CDATA[other-name]]></test>
66
<typed_virtual_property>1</typed_virtual_property>
77
</result>
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
exist_field: value
2-
test: other-name
32
virtual_value: value
3+
test: other-name
44
typed_virtual_property: 1

0 commit comments

Comments
 (0)