4 * PEL: PHP Exif Library.
5 * A library with support for reading and
6 * writing all Exif headers in JPEG and TIFF images using PHP.
8 * Copyright (C) 2004 Martin Geisler.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program in the file COPYING; if not, write to the
22 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
23 * Boston, MA 02110-1301 USA
26 use lsolesen\pel\PelConvert;
28 class ConvertTest extends \PHPUnit_Framework_TestCase
31 private $bytes = "\x00\x00\x00\x00\x01\x23\x45\x67\x89\xAB\xCD\xEF\xFF\xFF\xFF\xFF";
33 function testLongLittle()
35 $o = PelConvert::LITTLE_ENDIAN;
37 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 0, $o), 0x00000000);
38 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 1, $o), 0x01000000);
39 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 2, $o), 0x23010000);
40 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 3, $o), 0x45230100);
41 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 4, $o), 0x67452301);
42 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 5, $o), 0x89674523);
43 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 6, $o), 0xAB896745);
44 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 7, $o), 0xCDAB8967);
45 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 8, $o), 0xEFCDAB89);
46 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 9, $o), 0xFFEFCDAB);
47 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 10, $o), 0xFFFFEFCD);
48 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 11, $o), 0xFFFFFFEF);
49 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 12, $o), 0xFFFFFFFF);
52 function testLongBig()
54 $o = PelConvert::BIG_ENDIAN;
56 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 0, $o), 0x00000000);
57 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 1, $o), 0x00000001);
58 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 2, $o), 0x00000123);
59 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 3, $o), 0x00012345);
60 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 4, $o), 0x01234567);
61 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 5, $o), 0x23456789);
62 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 6, $o), 0x456789AB);
63 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 7, $o), 0x6789ABCD);
64 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 8, $o), 0x89ABCDEF);
65 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 9, $o), 0xABCDEFFF);
66 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 10, $o), 0xCDEFFFFF);
67 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 11, $o), 0xEFFFFFFF);
68 $this->assertEquals(PelConvert::bytesToLong($this->bytes, 12, $o), 0xFFFFFFFF);
71 function testSLongLittle()
73 // TODO: Does not work on 64bit systems!
74 $this->markTestIncomplete(
75 'Does not work on 64bit systems!'
77 $o = PelConvert::LITTLE_ENDIAN;
80 * The easiest way to calculate the numbers to compare with, is to
81 * let PHP do the arithmetic for us. When using the bit-wise
82 * operators PHP will return a proper signed 32 bit integer.
85 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 0, $o), 0x00 << 24 | 0x00 << 16 | 0x00 << 8 | 0x00);
86 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 1, $o), 0x01 << 24 | 0x00 << 16 | 0x00 << 8 | 0x00);
87 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 2, $o), 0x23 << 24 | 0x01 << 16 | 0x00 << 8 | 0x00);
88 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 3, $o), 0x45 << 24 | 0x23 << 16 | 0x01 << 8 | 0x00);
89 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 4, $o), 0x67 << 24 | 0x45 << 16 | 0x23 << 8 | 0x01);
90 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 5, $o), 0x89 << 24 | 0x67 << 16 | 0x45 << 8 | 0x23);
91 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 6, $o), 0xAB << 24 | 0x89 << 16 | 0x67 << 8 | 0x45);
92 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 7, $o), 0xCD << 24 | 0xAB << 16 | 0x89 << 8 | 0x67);
93 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 8, $o), 0xEF << 24 | 0xCD << 16 | 0xAB << 8 | 0x89);
94 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 9, $o), 0xFF << 24 | 0xEF << 16 | 0xCD << 8 | 0xAB);
95 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 10, $o), 0xFF << 24 | 0xFF << 16 | 0xEF << 8 | 0xCD);
96 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 11, $o), 0xFF << 24 | 0xFF << 16 | 0xFF << 8 | 0xEF);
97 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 12, $o), 0xFF << 24 | 0xFF << 16 | 0xFF << 8 | 0xFF);
100 function testSLongBig()
102 // TODO: Does not work on 64bit systems
103 $this->markTestIncomplete(
104 'Does not work on 64bit systems!'
107 $o = PelConvert::BIG_ENDIAN;
109 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 0, $o), 0x00 << 24 | 0x00 << 16 | 0x00 << 8 | 0x00);
110 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 1, $o), 0x00 << 24 | 0x00 << 16 | 0x00 << 8 | 0x01);
111 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 2, $o), 0x00 << 24 | 0x00 << 16 | 0x01 << 8 | 0x23);
112 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 3, $o), 0x00 << 24 | 0x01 << 16 | 0x23 << 8 | 0x45);
113 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 4, $o), 0x01 << 24 | 0x23 << 16 | 0x45 << 8 | 0x67);
114 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 5, $o), 0x23 << 24 | 0x45 << 16 | 0x67 << 8 | 0x89);
115 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 6, $o), 0x45 << 24 | 0x67 << 16 | 0x89 << 8 | 0xAB);
116 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 7, $o), 0x67 << 24 | 0x89 << 16 | 0xAB << 8 | 0xCD);
117 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 8, $o), 0x89 << 24 | 0xAB << 16 | 0xCD << 8 | 0xEF);
118 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 9, $o), 0xAB << 24 | 0xCD << 16 | 0xEF << 8 | 0xFF);
119 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 10, $o), 0xCD << 24 | 0xEF << 16 | 0xFF << 8 | 0xFF);
120 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 11, $o), 0xEF << 24 | 0xFF << 16 | 0xFF << 8 | 0xFF);
121 $this->assertEquals(PelConvert::bytesToSLong($this->bytes, 12, $o), 0xFF << 24 | 0xFF << 16 | 0xFF << 8 | 0xFF);
124 function testShortLittle()
126 $o = PelConvert::LITTLE_ENDIAN;
128 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 0, $o), 0x0000);
129 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 1, $o), 0x0000);
130 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 2, $o), 0x0000);
131 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 3, $o), 0x0100);
132 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 4, $o), 0x2301);
133 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 5, $o), 0x4523);
134 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 6, $o), 0x6745);
135 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 7, $o), 0x8967);
136 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 8, $o), 0xAB89);
137 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 9, $o), 0xCDAB);
138 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 10, $o), 0xEFCD);
139 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 11, $o), 0xFFEF);
140 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 12, $o), 0xFFFF);
141 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 13, $o), 0xFFFF);
142 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 14, $o), 0xFFFF);
145 function testShortBig()
147 $o = PelConvert::BIG_ENDIAN;
149 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 0, $o), 0x0000);
150 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 1, $o), 0x0000);
151 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 2, $o), 0x0000);
152 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 3, $o), 0x0001);
153 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 4, $o), 0x0123);
154 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 5, $o), 0x2345);
155 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 6, $o), 0x4567);
156 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 7, $o), 0x6789);
157 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 8, $o), 0x89AB);
158 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 9, $o), 0xABCD);
159 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 10, $o), 0xCDEF);
160 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 11, $o), 0xEFFF);
161 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 12, $o), 0xFFFF);
162 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 13, $o), 0xFFFF);
163 $this->assertEquals(PelConvert::bytesToShort($this->bytes, 14, $o), 0xFFFF);
166 function testSShortLittle()
168 $o = PelConvert::LITTLE_ENDIAN;
170 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 0, $o), 0);
171 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 1, $o), 0);
172 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 2, $o), 0);
173 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 3, $o), 256);
174 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 4, $o), 8961);
175 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 5, $o), 17699);
176 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 6, $o), 26437);
177 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 7, $o), - 30361);
178 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 8, $o), - 21623);
179 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 9, $o), - 12885);
180 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 10, $o), - 4147);
181 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 11, $o), - 17);
182 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 12, $o), - 1);
183 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 13, $o), - 1);
184 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 14, $o), - 1);
187 function testSShortBig()
189 $o = PelConvert::BIG_ENDIAN;
191 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 0, $o), 0);
192 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 1, $o), 0);
193 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 2, $o), 0);
194 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 3, $o), 1);
195 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 4, $o), 291);
196 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 5, $o), 9029);
197 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 6, $o), 17767);
198 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 7, $o), 26505);
199 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 8, $o), - 30293);
200 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 9, $o), - 21555);
201 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 10, $o), - 12817);
202 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 11, $o), - 4097);
203 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 12, $o), - 1);
204 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 13, $o), - 1);
205 $this->assertEquals(PelConvert::bytesToSShort($this->bytes, 14, $o), - 1);
210 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 0), 0x00);
211 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 1), 0x00);
212 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 2), 0x00);
213 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 3), 0x00);
214 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 4), 0x01);
215 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 5), 0x23);
216 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 6), 0x45);
217 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 7), 0x67);
218 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 8), 0x89);
219 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 9), 0xAB);
220 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 10), 0xCD);
221 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 11), 0xEF);
222 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 12), 0xFF);
223 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 13), 0xFF);
224 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 14), 0xFF);
225 $this->assertEquals(PelConvert::bytesToByte($this->bytes, 15), 0xFF);
230 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 0), 0);
231 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 1), 0);
232 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 2), 0);
233 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 3), 0);
234 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 4), 1);
235 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 5), 35);
236 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 6), 69);
237 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 7), 103);
238 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 8), - 119);
239 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 9), - 85);
240 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 10), - 51);
241 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 11), - 17);
242 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 12), - 1);
243 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 13), - 1);
244 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 14), - 1);
245 $this->assertEquals(PelConvert::bytesToSByte($this->bytes, 15), - 1);