convert_tests.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. 'use strict';
  2. /* jshint node: true */
  3. var fs = require('fs');
  4. var path = require('path');
  5. var earcut = require('../../earcut/src/earcut.js');
  6. var integerPolygons = '';
  7. var doublePolygons = '';
  8. var base = '../earcut/test/fixtures';
  9. fs.readdirSync(base).filter(function (name) {
  10. return path.extname(name) === '.json';
  11. }).forEach(function (name) {
  12. var json = JSON.parse(fs.readFileSync(path.join(base, name), 'utf-8'));
  13. var data = earcut.flatten(json),
  14. indices = earcut(data.vertices, data.holes, data.dimensions),
  15. deviation = earcut.deviation(data.vertices, data.holes, data.dimensions, indices);
  16. var id = path.basename(name, path.extname(name)).replace(/[^a-z0-9]+/g, '_');
  17. var integer = true;
  18. var short_integer = true;
  19. function processPoint(p) {
  20. if (integer && (p[0] % 1 !== 0 || p[1] % 1 !== 0)) {
  21. integer = false;
  22. short_integer = false;
  23. }
  24. if (short_integer && (p[0] < -32767 || p[0] > 32767 || p[1] < -32767 || p[1] > 32767)) {
  25. short_integer = false;
  26. }
  27. return p.join(',');
  28. }
  29. var geometry = '';
  30. for (var i = 0; i < json.length; i++) {
  31. geometry += ' {{' + (json[i].map(processPoint).join('},{')) + '}},\n';
  32. }
  33. var className = "Fixture<double>"
  34. if (short_integer) {
  35. className = "Fixture<short>"
  36. } else if (integer) {
  37. className = "Fixture<int>"
  38. }
  39. var expectedTriangles = indices.length / 3;
  40. var expectedDeviation = deviation;
  41. expectedDeviation += 1e-14;
  42. var libtessDeviationMap = {
  43. "water": 0.00002,
  44. "water_huge": 0.0002,
  45. "water_huge2": 0.00015,
  46. "bad_hole": 0.0022,
  47. "issue16": 0.0255,
  48. "self_touching": 0.002,
  49. "simplified_us_border": 0.001,
  50. "issue45": 0.094,
  51. "empty_square": Infinity,
  52. "issue83": Infinity,
  53. "issue107": Infinity,
  54. "issue119": 0.04,
  55. "touching4": 0.06
  56. };
  57. var expectedLibtessDeviation = libtessDeviationMap[id];
  58. if (!expectedLibtessDeviation) expectedLibtessDeviation = 0.000001;
  59. var cpp = '// This file is auto-generated, manual changes will be lost if the code is regenerated.\n\n';
  60. cpp += '#include "geometries.hpp"\n\n';
  61. cpp += 'namespace mapbox {\n';
  62. cpp += 'namespace fixtures {\n\n';
  63. cpp += 'static const ' + className + ' ' + id + '("' + id + '", ' + expectedTriangles + ', ' + expectedDeviation + ', ' + expectedLibtessDeviation +', {\n';
  64. cpp += geometry;
  65. cpp += '});\n\n';
  66. cpp += '}\n';
  67. cpp += '}\n';
  68. fs.writeFileSync('test/fixtures/' + id + '.cpp', cpp);
  69. });