Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | <?php |
||
27 | class ConverterTests extends TestCase { |
||
28 | |||
29 | /** |
||
30 | * @dataProvider providesNewUsers |
||
31 | */ |
||
32 | 4 | public function testCreation($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) { |
|
33 | 4 | $user = $this->getUserMock($displayName, $eMailAddress, $cloudId); |
|
34 | |||
35 | 4 | $converter = new Converter(); |
|
36 | 4 | $vCard = $converter->createCardFromUser($user); |
|
37 | 4 | $cardData = $vCard->serialize(); |
|
38 | |||
39 | 4 | $this->assertEquals($expectedVCard, $cardData); |
|
40 | 4 | } |
|
41 | |||
42 | 1 | View Code Duplication | public function providesNewUsers() { |
43 | return [ |
||
44 | 1 | ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.8//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n"], |
|
45 | ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.8//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar"], |
||
46 | ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.8//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nEMAIL;TYPE=OTHER:[email protected]\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", "[email protected]"], |
||
47 | ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.8//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nCLOUD:[email protected]\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "[email protected]"], |
||
48 | ]; |
||
49 | } |
||
50 | |||
51 | /** |
||
52 | * @dataProvider providesNewUsers |
||
53 | */ |
||
54 | 4 | public function testUpdateOfUnchangedUser($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) { |
|
55 | 4 | $user = $this->getUserMock($displayName, $eMailAddress, $cloudId); |
|
56 | |||
57 | 4 | $converter = new Converter(); |
|
58 | 4 | $vCard = $converter->createCardFromUser($user); |
|
59 | 4 | $updated = $converter->updateCard($vCard, $user); |
|
60 | 4 | $this->assertFalse($updated); |
|
61 | 4 | $cardData = $vCard->serialize(); |
|
62 | |||
63 | 4 | $this->assertEquals($expectedVCard, $cardData); |
|
64 | 4 | } |
|
65 | |||
66 | /** |
||
67 | * @dataProvider providesUsersForUpdateOfRemovedElement |
||
68 | */ |
||
69 | 3 | public function testUpdateOfRemovedElement($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) { |
|
70 | 3 | $user = $this->getUserMock($displayName, $eMailAddress, $cloudId); |
|
71 | |||
72 | 3 | $converter = new Converter(); |
|
73 | 3 | $vCard = $converter->createCardFromUser($user); |
|
74 | |||
75 | 3 | $user1 = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock(); |
|
76 | 3 | $user1->method('getUID')->willReturn('12345'); |
|
77 | 3 | $user1->method('getDisplayName')->willReturn(null); |
|
78 | 3 | $user1->method('getEMailAddress')->willReturn(null); |
|
79 | 3 | $user1->method('getCloudId')->willReturn(null); |
|
80 | 3 | $user1->method('getAvatarImage')->willReturn(null); |
|
81 | |||
82 | 3 | $updated = $converter->updateCard($vCard, $user1); |
|
83 | 3 | $this->assertTrue($updated); |
|
84 | 3 | $cardData = $vCard->serialize(); |
|
85 | |||
86 | 3 | $this->assertEquals($expectedVCard, $cardData); |
|
87 | 3 | } |
|
88 | |||
89 | View Code Duplication | public function providesUsersForUpdateOfRemovedElement() { |
|
90 | return [ |
||
91 | ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.8//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"], |
||
92 | ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.8//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar", "[email protected]"], |
||
93 | ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.8//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "[email protected]"], |
||
94 | ]; |
||
95 | } |
||
96 | |||
97 | /** |
||
98 | * @dataProvider providesNames |
||
99 | * @param $expected |
||
100 | * @param $fullName |
||
101 | */ |
||
102 | 6 | public function testNameSplitter($expected, $fullName) { |
|
109 | |||
110 | public function providesNames() { |
||
117 | |||
118 | /** |
||
119 | * @param $displayName |
||
120 | * @param $eMailAddress |
||
121 | * @param $cloudId |
||
122 | * @return \PHPUnit_Framework_MockObject_MockObject |
||
123 | */ |
||
124 | 11 | protected function getUserMock($displayName, $eMailAddress, $cloudId) { |
|
136 | } |
||
137 |