openscad-cpp-evaluator 1.28.2__tar.gz → 1.28.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/eval_use.hpp +4 -0
  3. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/text_metrics.hpp +5 -1
  4. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/pyproject.toml +1 -1
  5. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/function_builtins.cpp +4 -3
  6. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/text.cpp +2 -1
  7. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/csg_resolve.cpp +4 -1
  8. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/eval_use.cpp +5 -0
  9. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/text/text_metrics.cpp +19 -4
  10. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_coverage.cpp +28 -0
  11. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_text.cpp +27 -0
  12. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/uv.lock +1 -1
  13. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/.github/workflows/ci.yml +0 -0
  14. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/.github/workflows/wheels.yml +0 -0
  15. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/.gitignore +0 -0
  16. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/.gitmodules +0 -0
  17. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/CLAUDE.md +0 -0
  18. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/CMakeLists.txt +0 -0
  19. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/LICENSE +0 -0
  20. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/README.md +0 -0
  21. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/bindings/CMakeLists.txt +0 -0
  22. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/bindings/ast_to_py.cpp +0 -0
  23. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/bindings/module.cpp +0 -0
  24. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/cmake/embed_font.cmake +0 -0
  25. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/examples/CMakeLists.txt +0 -0
  26. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/examples/eval_perf_benchmark.cpp +0 -0
  27. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/examples/manifold_cache_reuse.cpp +0 -0
  28. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/examples/minimal_debugger.cpp +0 -0
  29. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  30. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/.gitignore +0 -0
  31. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  32. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  33. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/README.md +0 -0
  34. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  35. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  36. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  37. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  38. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  39. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  40. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  41. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  42. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  43. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  44. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  45. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  46. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  47. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope_table.hpp +0 -0
  48. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  49. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  50. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  51. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/api.cpp +0 -0
  52. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  53. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  54. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  55. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  56. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  57. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  58. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  59. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  60. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  61. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  62. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  63. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  64. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  65. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  66. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  67. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  68. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/position.cpp +0 -0
  69. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  70. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  71. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  72. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  73. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  74. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  75. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  76. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  77. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  78. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  79. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  80. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  81. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  82. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  83. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  84. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  85. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  86. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  87. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  88. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
  89. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  90. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  91. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  92. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  93. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_strict_commas.cpp +0 -0
  94. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  95. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  96. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  97. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  98. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  99. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  100. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  101. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  102. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  103. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  104. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/coverage.hpp +0 -0
  105. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  106. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  107. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  108. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  109. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  110. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  111. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  112. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  113. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  114. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/export.hpp +0 -0
  115. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  116. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  117. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/format_closure.hpp +0 -0
  118. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  119. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  120. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  121. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  122. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  123. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  124. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  125. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  126. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  127. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  128. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  129. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/utf8.hpp +0 -0
  130. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/value.hpp +0 -0
  131. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  132. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/python/openscad_cpp_evaluator/__init__.py +0 -0
  133. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/resources/fonts/LICENSE +0 -0
  134. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/resources/fonts/LiberationSans-Bold.ttf +0 -0
  135. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/resources/fonts/LiberationSans-BoldItalic.ttf +0 -0
  136. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/resources/fonts/LiberationSans-Italic.ttf +0 -0
  137. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  138. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/CMakeLists.txt +0 -0
  139. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/booleans.cpp +0 -0
  140. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/builtins.hpp +0 -0
  141. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/call_args.cpp +0 -0
  142. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/color.cpp +0 -0
  143. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/control.cpp +0 -0
  144. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/dxf_dim.cpp +0 -0
  145. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/extrude.cpp +0 -0
  146. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/import.cpp +0 -0
  147. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/modifiers.cpp +0 -0
  148. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/primitives_2d.cpp +0 -0
  149. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/primitives_3d.cpp +0 -0
  150. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/registry.cpp +0 -0
  151. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/roof.cpp +0 -0
  152. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/segments.cpp +0 -0
  153. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/surface.cpp +0 -0
  154. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/topology.cpp +0 -0
  155. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/builtins/transforms.cpp +0 -0
  156. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/bytecode_compiler.cpp +0 -0
  157. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/bytecode_vm.cpp +0 -0
  158. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/colored_body.cpp +0 -0
  159. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/coverage.cpp +0 -0
  160. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/csg_generate.cpp +0 -0
  161. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/css_colors.cpp +0 -0
  162. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/debug/debug_repl.cpp +0 -0
  163. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/debug_profile.cpp +0 -0
  164. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/eval_context.cpp +0 -0
  165. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/eval_error.cpp +0 -0
  166. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/export.cpp +0 -0
  167. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/expr_eval.cpp +0 -0
  168. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/format_closure.cpp +0 -0
  169. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/import/dxf_import.cpp +0 -0
  170. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/import/mesh_import.cpp +0 -0
  171. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/import/surface_load.cpp +0 -0
  172. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/import/svg_import.cpp +0 -0
  173. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/manifold_cache.cpp +0 -0
  174. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/measure_geometry.cpp +0 -0
  175. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/mesh_check.cpp +0 -0
  176. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/stmt_eval.cpp +0 -0
  177. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/text/font_match.cpp +0 -0
  178. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/text/freetype_font_provider.cpp +0 -0
  179. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/user_calls.cpp +0 -0
  180. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/utf8.cpp +0 -0
  181. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/value.cpp +0 -0
  182. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/src/zip_stored.cpp +0 -0
  183. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/CMakeLists.txt +0 -0
  184. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_booleans.cpp +0 -0
  185. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_bytecode_compiler.cpp +0 -0
  186. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_children_separate.cpp +0 -0
  187. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_cli.cpp +0 -0
  188. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_control_flow.cpp +0 -0
  189. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_csg_tree.cpp +0 -0
  190. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_debug_hooks.cpp +0 -0
  191. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_dxf_svg_import.cpp +0 -0
  192. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_eval_context.cpp +0 -0
  193. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_export.cpp +0 -0
  194. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_expr_eval.cpp +0 -0
  195. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_extrude_roof.cpp +0 -0
  196. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_feature_detection.cpp +0 -0
  197. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_function_builtins.cpp +0 -0
  198. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_helpers.hpp +0 -0
  199. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_import_export.cpp +0 -0
  200. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_include_cache.cpp +0 -0
  201. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_manifold_cache.cpp +0 -0
  202. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_mesh_check.cpp +0 -0
  203. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_multi_color_merge.cpp +0 -0
  204. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_primitives.cpp +0 -0
  205. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_profiling.cpp +0 -0
  206. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_python_bindings.py +0 -0
  207. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_render_expr.cpp +0 -0
  208. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_scope_trail.cpp +0 -0
  209. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_scoping.cpp +0 -0
  210. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_surface.cpp +0 -0
  211. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_tail_calls.cpp +0 -0
  212. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_transforms.cpp +0 -0
  213. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_unexpected_args.cpp +0 -0
  214. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_use.cpp +0 -0
  215. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_value.cpp +0 -0
  216. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_viewport_params.cpp +0 -0
  217. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tests/test_zip_stored.cpp +0 -0
  218. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tools/cli/CMakeLists.txt +0 -0
  219. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tools/cli/cli_lib.cpp +0 -0
  220. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tools/cli/cli_lib.hpp +0 -0
  221. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.4}/tools/cli/main.cpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 1.28.2
3
+ Version: 1.28.4
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -24,6 +24,10 @@ namespace oscadeval {
24
24
  struct UsedFileGlobals {
25
25
  const oscad::Scope* root = nullptr;
26
26
  std::vector<const oscad::ASTNode*> assignments;
27
+ // Every module/function the file sees -- its own and what it use<>d --
28
+ // for coverage, which is otherwise handed only the top file's nodes, so
29
+ // a file reached only by a nested use<> went unreported.
30
+ std::vector<const oscad::ASTNode*> declarations;
27
31
  };
28
32
 
29
33
  struct ResolvedUseScopes {
@@ -2,6 +2,7 @@
2
2
 
3
3
  #include "openscad_cpp_evaluator/font_provider.hpp"
4
4
 
5
+ #include <functional>
5
6
  #include <string>
6
7
  #include <utility>
7
8
  #include <vector>
@@ -44,7 +45,10 @@ TextMeasurement measureText(FontProvider& fp, FontHandle handle, const std::stri
44
45
  // center/top for a vertical one, as in OpenSCAD; text with no ink is not
45
46
  // moved at all. Shared by textmetrics() (reports it) and text()
46
47
  // (applies it).
48
+ // `warn`, when given, receives OpenSCAD's own warning for an unknown
49
+ // halign/valign, and for valign="baseline" on a vertical run.
47
50
  std::pair<double, double> textAlignOffset(const std::string& halign, const std::string& valign,
48
- const TextMeasurement& m);
51
+ const TextMeasurement& m,
52
+ const std::function<void(const std::string&)>& warn = {});
49
53
 
50
54
  } // namespace oscadeval
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "1.28.2"
7
+ version = "1.28.4"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -782,7 +782,7 @@ Value objectOf(std::vector<std::pair<std::string, Value>> items) {
782
782
  // descent/offset/advance in real OpenSCAD's key order. Going through the
783
783
  // same measureText() the geometry goes through is the point: the numbers
784
784
  // a script positions against cannot disagree with what it draws.
785
- Value builtinTextmetrics(Evaluator& ev, const CallArgs& args) {
785
+ Value builtinTextmetrics(Evaluator& ev, const CallArgs& args, const oscad::Position* pos) {
786
786
  const std::string text = asStringOr(getArg(args, 0, "text", Value{std::string("")}), "");
787
787
  const double size = toDoubleLenient(getArg(args, 1, "size", Value{10.0}));
788
788
  // Positional indices, all of them: OpenSCAD's own signature is
@@ -804,7 +804,8 @@ Value builtinTextmetrics(Evaluator& ev, const CallArgs& args) {
804
804
  FontProvider& fp = ev.fontProvider();
805
805
  const FontHandle handle = fp.resolveFont(fontSpec);
806
806
  const TextMeasurement m = measureText(fp, handle, text, size, spacing, shape);
807
- const auto [offsetX, offsetY] = textAlignOffset(halign, valign, m);
807
+ const auto [offsetX, offsetY] = textAlignOffset(
808
+ halign, valign, m, [&](const std::string& w) { ev.warn(w, pos); });
808
809
 
809
810
  return objectOf({
810
811
  {"position", numList({offsetX + m.left, offsetY + m.bottom})},
@@ -1251,7 +1252,7 @@ Value evalBuiltinFunctionResolved(Evaluator& ev, BuiltinFnId id, const std::vect
1251
1252
 
1252
1253
  switch (id) {
1253
1254
  case BuiltinFnId::None: return Value{}; // unreachable: handled above
1254
- case BuiltinFnId::TextMetrics: return builtinTextmetrics(ev, args);
1255
+ case BuiltinFnId::TextMetrics: return builtinTextmetrics(ev, args, &node.position());
1255
1256
  case BuiltinFnId::FontMetrics: return builtinFontmetrics(ev, args);
1256
1257
  case BuiltinFnId::Abs: return Value{std::fabs(toDoubleLenient(getArg(args, 0, "x", Value{})))};
1257
1258
  case BuiltinFnId::Sign: {
@@ -60,7 +60,8 @@ CSGParams resolveText(Evaluator& ev, const oscad::ModularCall& node, EvalContext
60
60
  const double scale = size * (100.0 / 72.0) / fm.unitsPerEm;
61
61
  const int segs = std::max(2, fnSegmentsFromCtx(effCtx) / 2);
62
62
  const TextMeasurement m = measureText(fp, handle, text, size, spacing, shape);
63
- const auto [offsetX, offsetY] = textAlignOffset(halign, valign, m);
63
+ const auto [offsetX, offsetY] = textAlignOffset(
64
+ halign, valign, m, [&](const std::string& w) { ev.warn(w, &node.position()); });
64
65
 
65
66
  std::vector<Value> glyphs;
66
67
  glyphs.reserve(m.glyphs.size());
@@ -303,7 +303,10 @@ std::vector<ColoredBody> Evaluator::evaluateImpl(const NodeList& nodes, EvalCont
303
303
  roots.reserve(nodes.size());
304
304
  for (const auto& n : nodes) roots.push_back(&*n);
305
305
  std::vector<const oscad::ASTNode*> extra;
306
- for (const UsedFileGlobals& g : usedFileGlobals_) extra.insert(extra.end(), g.assignments.begin(), g.assignments.end());
306
+ for (const UsedFileGlobals& g : usedFileGlobals_) {
307
+ extra.insert(extra.end(), g.assignments.begin(), g.assignments.end());
308
+ roots.insert(roots.end(), g.declarations.begin(), g.declarations.end()); // merged by position
309
+ }
307
310
  coverageResult = buildCoverageResult(roots, extra, coverageRecorder_);
308
311
  }
309
312
 
@@ -92,6 +92,11 @@ ResolvedUseScopes resolveUseScopesInto(const std::vector<const oscad::ASTNode*>&
92
92
  for (const oscad::ASTNode* n : nested.ownNodesFiltered) {
93
93
  if (n->kind() == oscad::NodeKind::Assignment) globals.assignments.push_back(n);
94
94
  }
95
+ for (const oscad::ASTNode* n : nested.processedNodes) {
96
+ if (n->kind() == oscad::NodeKind::ModuleDeclaration || n->kind() == oscad::NodeKind::FunctionDeclaration) {
97
+ globals.declarations.push_back(n);
98
+ }
99
+ }
95
100
  result.usedFileGlobals.push_back(std::move(globals));
96
101
  }
97
102
 
@@ -55,24 +55,39 @@ TextMeasurement measureText(FontProvider& fp, FontHandle handle, const std::stri
55
55
  return m;
56
56
  }
57
57
 
58
- // OpenSCAD's ShapeResults::calc_offsets_horiz/_vert. An unknown value (and,
59
- // for a vertical run, valign="baseline") does not move the text there
60
- // either; OpenSCAD also warns, which this does not.
58
+ // OpenSCAD's ShapeResults::calc_offsets_horiz/_vert, warnings included. An
59
+ // unknown value, or valign="baseline" on a vertical run, leaves that axis
60
+ // where it is. Text with no ink never gets this far there, so it never
61
+ // warns either.
61
62
  std::pair<double, double> textAlignOffset(const std::string& halign, const std::string& valign,
62
- const TextMeasurement& m) {
63
+ const TextMeasurement& m,
64
+ const std::function<void(const std::string&)>& warn) {
63
65
  if (!m.hasInk) return {0.0, 0.0};
66
+ auto unknown = [&](const char* param, const char* choices, const std::string& value) {
67
+ if (warn) {
68
+ warn(std::string("Unknown value for the ") + param + " parameter (use " + choices + "): '" + value + "'");
69
+ }
70
+ };
71
+ const char* hChoices = "\"left\", \"right\" or \"center\"";
72
+ const char* vChoices = "\"baseline\", \"bottom\", \"top\" or \"center\"";
64
73
  double offsetX = 0.0, offsetY = 0.0;
65
74
  if (m.vertical) {
66
75
  if (halign == "right") offsetX = -m.right;
67
76
  else if (halign == "left") offsetX = -m.left;
77
+ else if (halign != "center" && halign != "default") unknown("halign", hChoices, halign);
68
78
  if (valign == "center") offsetY = -m.advanceY / 2;
69
79
  else if (valign == "bottom") offsetY = -m.advanceY;
80
+ else if (valign == "baseline") {
81
+ if (warn) warn("Don't use valign=\"baseline\" with vertical layouts");
82
+ } else if (valign != "top" && valign != "default") unknown("valign", vChoices, valign);
70
83
  } else {
71
84
  if (halign == "center") offsetX = -0.5 * m.advanceX;
72
85
  else if (halign == "right") offsetX = -m.advanceX;
86
+ else if (halign != "left" && halign != "default") unknown("halign", hChoices, halign);
73
87
  if (valign == "top") offsetY = -m.ascent;
74
88
  else if (valign == "center") offsetY = -(m.ascent + m.descent) / 2;
75
89
  else if (valign == "bottom") offsetY = -m.descent;
90
+ else if (valign != "baseline" && valign != "default") unknown("valign", vChoices, valign);
76
91
  }
77
92
  return {offsetX, offsetY};
78
93
  }
@@ -299,4 +299,32 @@ TEST(Coverage, AFileUsedTwiceIsListedOnce) {
299
299
  fs::remove_all(dir);
300
300
  }
301
301
 
302
+ // A file reached only through a used file's own use<> ran too. Only the top
303
+ // file's nodes were handed to coverage, so its declarations went unlisted.
304
+ TEST(Coverage, AFileReachedByNestedUseIsListed) {
305
+ namespace fs = std::filesystem;
306
+ const fs::path dir = fs::temp_directory_path() / "oscad_cov_nested";
307
+ fs::create_directories(dir);
308
+ const fs::path lib = dir / "lib.scad", mid = dir / "mid.scad", main = dir / "main.scad";
309
+ std::ofstream(lib) << "g = 1;\nfunction hit(x) = x + g;\nfunction miss(x) = x;\n";
310
+ std::ofstream(mid) << "use <lib.scad>\nfunction f() = hit(1);\n";
311
+ std::ofstream(main) << "use <mid.scad>\necho(f(), f());\n";
312
+ auto ast = oscad::getASTFromFile(main.string());
313
+ ResolvedUseScopes uses = resolveUseScopes(ast, main.string(), {});
314
+ Evaluator ev({}, nullptr, nullptr, {}, false, /*coverage=*/true);
315
+ ev.setUsedFileGlobals(uses.usedFileGlobals);
316
+ EvalContext ctx = EvalContext::makeRoot(uses.rootScope.get());
317
+ ev.evaluate(uses.processedNodes, ctx, {}, false);
318
+ ASSERT_TRUE(ev.coverageResult.has_value());
319
+ std::map<std::pair<int, CoverageKind>, std::vector<std::uint32_t>> libSpans;
320
+ for (const CoverageSpan& s : ev.coverageResult->spans) {
321
+ if (fs::path(s.origin).filename() == "lib.scad") libSpans[{s.line, s.kind}].push_back(s.hits);
322
+ }
323
+ auto hits = [&](int line, CoverageKind kind) { return libSpans[std::make_pair(line, kind)]; };
324
+ EXPECT_EQ(hits(2, CoverageKind::Body), std::vector<std::uint32_t>{2u});
325
+ EXPECT_EQ(hits(3, CoverageKind::Body), std::vector<std::uint32_t>{0u});
326
+ EXPECT_EQ(hits(1, CoverageKind::Statement), std::vector<std::uint32_t>{1u}); // its global, read and so evaluated, once
327
+ fs::remove_all(dir);
328
+ }
329
+
302
330
  } // namespace oscadeval
@@ -126,6 +126,33 @@ TEST(Textmetrics, VerticalRunAlignsByItsOwnRules) {
126
126
  EXPECT_NEAR(vec(rb, "offset", 1), 39.1032, 1e-3);
127
127
  }
128
128
 
129
+ // OpenSCAD 2026.02.01's warnings, verbatim. Inkless text never reaches
130
+ // its alignment code there, so it does not warn.
131
+ TEST(Text, UnknownAlignmentWarnsAsOpenscadDoes) {
132
+ const std::pair<const char*, std::vector<std::string>> cases[] = {
133
+ {"m = textmetrics(\"ab\", halign=\"middle\");",
134
+ {"Unknown value for the halign parameter (use \"left\", \"right\" or \"center\"): 'middle'"}},
135
+ {"m = textmetrics(\"ab\", valign=\"mid\");",
136
+ {"Unknown value for the valign parameter (use \"baseline\", \"bottom\", \"top\" or \"center\"): 'mid'"}},
137
+ {"m = textmetrics(\"ab\", direction=\"ttb\", valign=\"baseline\");",
138
+ {"Don't use valign=\"baseline\" with vertical layouts"}},
139
+ {"text(\"ab\", direction=\"ttb\", halign=\"x\", valign=\"y\");",
140
+ {"Unknown value for the halign parameter (use \"left\", \"right\" or \"center\"): 'x'",
141
+ "Unknown value for the valign parameter (use \"baseline\", \"bottom\", \"top\" or \"center\"): 'y'"}},
142
+ {"m = textmetrics(\" \", halign=\"bogus\");", {}},
143
+ {"m = textmetrics(\"ab\", halign=\"default\", valign=\"default\");", {}},
144
+ {"m = textmetrics(\"ab\", direction=\"ttb\", valign=\"top\");", {}},
145
+ };
146
+ for (const auto& [src, want] : cases) {
147
+ std::vector<std::string> log;
148
+ evalSrc(src, [&](const std::string& m) { log.push_back(m); });
149
+ ASSERT_EQ(log.size(), want.size()) << src;
150
+ for (size_t i = 0; i < want.size(); ++i) {
151
+ EXPECT_EQ(log[i], "WARNING: " + want[i] + " in file <string>, line 1") << src;
152
+ }
153
+ }
154
+ }
155
+
129
156
  TEST(Textmetrics, InklessTextIsNotAligned) {
130
157
  Evaluator ev;
131
158
  Value v = asExpr("textmetrics(\" \", size=10, halign=\"right\")", ev);
@@ -55,7 +55,7 @@ wheels = [
55
55
 
56
56
  [[package]]
57
57
  name = "openscad-cpp-evaluator"
58
- version = "1.28.2"
58
+ version = "1.28.4"
59
59
  source = { editable = "." }
60
60
  dependencies = [
61
61
  { name = "numpy" },