PageRenderTime 26ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/sites/all/modules/geophp/geoPHP/tests/tests/methodsTest.php

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