/sites/all/libraries/geoPHP/tests/tests/methodsTest.php

https://gitlab.com/leoplanxxi/dr7-web-buap-2016 · PHP · 359 lines · 316 code · 23 blank · 20 comment · 120 complexity · d046501afaa4a06ff13b45d78995f871 MD5 · raw file

  1. <?php
  2. require_once('../geoPHP.inc');
  3. class MethodsTests extends PHPUnit_Framework_TestCase {
  4. function setUp() {
  5. }
  6. function testMethods() {
  7. foreach (scandir('./input') as $file) {
  8. $parts = explode('.',$file);
  9. if ($parts[0]) {
  10. $format = $parts[1];
  11. $value = file_get_contents('./input/'.$file);
  12. echo "\nloading: " . $file . " for format: " . $format;
  13. $geometry = geoPHP::load($value, $format);
  14. $methods = array(
  15. array('name' => 'area'),
  16. array('name' => 'boundary'),
  17. array('name' => 'getBBox'),
  18. array('name' => 'centroid'),
  19. array('name' => 'length'),
  20. array('name' => 'greatCircleLength'),
  21. array('name' => 'haversineLength'),
  22. array('name' => 'y'),
  23. array('name' => 'x'),
  24. array('name' => 'numGeometries'),
  25. array('name' => 'geometryN', 'argument' => '1'),
  26. array('name' => 'startPoint'),
  27. array('name' => 'endPoint'),
  28. array('name' => 'isRing'),
  29. array('name' => 'isClosed'),
  30. array('name' => 'numPoints'),
  31. array('name' => 'pointN', 'argument' => '1'),
  32. array('name' => 'exteriorRing'),
  33. array('name' => 'numInteriorRings'),
  34. array('name' => 'interiorRingN', 'argument' => '1'),
  35. array('name' => 'dimension'),
  36. array('name' => 'geometryType'),
  37. array('name' => 'SRID'),
  38. array('name' => 'setSRID', 'argument' => '4326'),
  39. );
  40. foreach($methods as $method) {
  41. $argument = NULL;
  42. $method_name = $method['name'];
  43. if (isset($method['argument'])) {
  44. $argument = $method['argument'];
  45. }
  46. $this->_methods_tester($geometry, $method_name, $argument, $file);
  47. }
  48. $this->_methods_tester_with_geos($geometry);
  49. }
  50. }
  51. }
  52. function _methods_tester($geometry, $method_name, $argument, $file) {
  53. if (!method_exists($geometry, $method_name)) {
  54. $this->fail("Method ".$method_name.'() doesn\'t exists.');
  55. return;
  56. }
  57. switch ($method_name) {
  58. case 'y':
  59. case 'x':
  60. if (!$geometry->isEmpty()) {
  61. if ($geometry->geometryType() == 'Point') {
  62. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  63. }
  64. if ($geometry->geometryType() == 'LineString') {
  65. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  66. }
  67. if ($geometry->geometryType() == 'MultiLineString') {
  68. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  69. }
  70. }
  71. break;
  72. case 'geometryN':
  73. if ($geometry->geometryType() == 'Point') {
  74. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  75. }
  76. if ($geometry->geometryType() == 'LineString') {
  77. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  78. }
  79. if ($geometry->geometryType() == 'MultiLineString') {
  80. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  81. }
  82. break;
  83. case 'startPoint':
  84. if ($geometry->geometryType() == 'Point') {
  85. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  86. }
  87. if ($geometry->geometryType() == 'LineString') {
  88. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  89. }
  90. if ($geometry->geometryType() == 'MultiLineString') {
  91. //TODO: Add a method startPoint() to MultiLineString.
  92. //$this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  93. }
  94. break;
  95. case 'endPoint':
  96. if ($geometry->geometryType() == 'Point') {
  97. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  98. }
  99. if ($geometry->geometryType() == 'LineString') {
  100. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  101. }
  102. if ($geometry->geometryType() == 'MultiLineString') {
  103. //TODO: Add a method endPoint() to MultiLineString.
  104. //$this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name);
  105. }
  106. break;
  107. case 'isRing':
  108. if ($geometry->geometryType() == 'Point') {
  109. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  110. }
  111. if ($geometry->geometryType() == 'LineString') {
  112. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  113. }
  114. if ($geometry->geometryType() == 'MultiLineString') {
  115. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  116. }
  117. break;
  118. case 'isClosed':
  119. if ($geometry->geometryType() == 'Point') {
  120. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  121. }
  122. if ($geometry->geometryType() == 'LineString') {
  123. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  124. }
  125. if ($geometry->geometryType() == 'MultiLineString') {
  126. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  127. }
  128. break;
  129. case 'pointN':
  130. if ($geometry->geometryType() == 'Point') {
  131. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  132. }
  133. if ($geometry->geometryType() == 'LineString') {
  134. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  135. }
  136. if ($geometry->geometryType() == 'MultiLineString') {
  137. //TODO: Add a method pointN() to MultiLineString.
  138. //$this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  139. }
  140. break;
  141. case 'exteriorRing':
  142. if ($geometry->geometryType() == 'Point') {
  143. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  144. }
  145. if ($geometry->geometryType() == 'LineString') {
  146. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  147. }
  148. if ($geometry->geometryType() == 'MultiLineString') {
  149. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  150. }
  151. break;
  152. case 'numInteriorRings':
  153. if ($geometry->geometryType() == 'Point') {
  154. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  155. }
  156. if ($geometry->geometryType() == 'LineString') {
  157. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  158. }
  159. if ($geometry->geometryType() == 'MultiLineString') {
  160. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  161. }
  162. break;
  163. case 'interiorRingN':
  164. if ($geometry->geometryType() == 'Point') {
  165. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  166. }
  167. if ($geometry->geometryType() == 'LineString') {
  168. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  169. }
  170. if ($geometry->geometryType() == 'MultiLineString') {
  171. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  172. }
  173. break;
  174. case 'SRID':
  175. break;
  176. case 'getBBox':
  177. if (!$geometry->isEmpty()) {
  178. if ($geometry->geometryType() == 'Point') {
  179. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  180. }
  181. if ($geometry->geometryType() == 'LineString') {
  182. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  183. }
  184. if ($geometry->geometryType() == 'MultiLineString') {
  185. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  186. }
  187. }
  188. break;
  189. case 'centroid':
  190. if ($geometry->geometryType() == 'Point') {
  191. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  192. }
  193. if ($geometry->geometryType() == 'LineString') {
  194. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  195. }
  196. if ($geometry->geometryType() == 'MultiLineString') {
  197. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  198. }
  199. break;
  200. case 'length':
  201. if ($geometry->geometryType() == 'Point') {
  202. $this->assertEquals($geometry->$method_name($argument), 0, 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  203. }
  204. if ($geometry->geometryType() == 'LineString') {
  205. $this->assertNotEquals($geometry->$method_name($argument), 0, 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  206. }
  207. if ($geometry->geometryType() == 'MultiLineString') {
  208. $this->assertNotEquals($geometry->$method_name($argument), 0, 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  209. }
  210. break;
  211. case 'numGeometries':
  212. if ($geometry->geometryType() == 'Point') {
  213. $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  214. }
  215. if ($geometry->geometryType() == 'LineString') {
  216. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  217. }
  218. if ($geometry->geometryType() == 'MultiLineString') {
  219. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  220. }
  221. break;
  222. case 'numPoints':
  223. if ($geometry->geometryType() == 'Point') {
  224. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  225. }
  226. if ($geometry->geometryType() == 'LineString') {
  227. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  228. }
  229. if ($geometry->geometryType() == 'MultiLineString') {
  230. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  231. }
  232. break;
  233. case 'dimension':
  234. if ($geometry->geometryType() == 'Point') {
  235. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  236. }
  237. if ($geometry->geometryType() == 'LineString') {
  238. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  239. }
  240. if ($geometry->geometryType() == 'MultiLineString') {
  241. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  242. }
  243. break;
  244. case 'boundary':
  245. if ($geometry->geometryType() == 'Point') {
  246. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  247. }
  248. if ($geometry->geometryType() == 'LineString') {
  249. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  250. }
  251. if ($geometry->geometryType() == 'MultiLineString') {
  252. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  253. }
  254. break;
  255. case 'haversineLength':
  256. //TODO: Check if output is a float >= 0.
  257. //TODO: Sometimes haversineLength() returns NAN, needs to check why.
  258. break;
  259. case 'greatCircleLength':
  260. case 'area':
  261. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  262. break;
  263. case 'geometryType':
  264. $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  265. break;
  266. case 'setSRID':
  267. //TODO: The method setSRID() should return TRUE.
  268. break;
  269. default:
  270. $this->assertTrue($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')');
  271. }
  272. }
  273. function _methods_tester_with_geos($geometry) {
  274. // Cannot test methods if GEOS is not intstalled
  275. if (!geoPHP::geosInstalled()) return;
  276. $methods = array(
  277. //'boundary', //@@TODO: Uncomment this and fix errors
  278. 'envelope', //@@TODO: Testing reveales errors in this method -- POINT vs. POLYGON
  279. 'getBBox',
  280. 'x',
  281. 'y',
  282. 'startPoint',
  283. 'endPoint',
  284. 'isRing',
  285. 'isClosed',
  286. 'numPoints',
  287. );
  288. foreach ($methods as $method) {
  289. // Turn GEOS on
  290. geoPHP::geosInstalled(TRUE);
  291. $geos_result = $geometry->$method();
  292. // Turn GEOS off
  293. geoPHP::geosInstalled(FALSE);
  294. $norm_result = $geometry->$method();
  295. // Turn GEOS back On
  296. geoPHP::geosInstalled(TRUE);
  297. $geos_type = gettype($geos_result);
  298. $norm_type = gettype($norm_result);
  299. if ($geos_type != $norm_type) {
  300. $this->fail('Type mismatch on '.$method);
  301. $this->dump($geos_type);
  302. $this->dump($norm_type);
  303. continue;
  304. }
  305. // Now check base on type
  306. if ($geos_type == 'object') {
  307. $haus_dist = $geos_result->hausdorffDistance(geoPHP::load($norm_result->out('wkt'),'wkt'));
  308. // Get the length of the diagonal of the bbox - this is used to scale the haustorff distance
  309. // Using Pythagorean theorem
  310. $bb = $geos_result->getBBox();
  311. $scale = sqrt((($bb['maxy'] - $bb['miny'])^2) + (($bb['maxx'] - $bb['minx'])^2));
  312. // The difference in the output of GEOS and native-PHP methods should be less than 0.5 scaled haustorff units
  313. if ($haus_dist / $scale > 0.5) {
  314. $this->fail('Output mismatch on '.$method);
  315. $this->dump('GEOS : ');
  316. $this->dump($geos_result->out('wkt'));
  317. $this->dump('NORM : ');
  318. $this->dump($norm_result->out('wkt'));
  319. continue;
  320. }
  321. }
  322. if ($geos_type == 'boolean' || $geos_type == 'string') {
  323. if ($geos_result !== $norm_result) {
  324. $this->fail('Output mismatch on '.$method);
  325. $this->dump('GEOS : ');
  326. $this->dump((string) $geos_result);
  327. $this->dump('NORM : ');
  328. $this->dump((string) $norm_result);
  329. continue;
  330. }
  331. }
  332. //@@TODO: Run tests for output of types arrays and float
  333. //@@TODO: centroid function is non-compliant for collections and strings
  334. }
  335. }
  336. }