aboutsummaryrefslogtreecommitdiff
path: root/Tests/qu2cu/qu2cu_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/qu2cu/qu2cu_test.py')
-rw-r--r--Tests/qu2cu/qu2cu_test.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/Tests/qu2cu/qu2cu_test.py b/Tests/qu2cu/qu2cu_test.py
new file mode 100644
index 00000000..3ca7ab55
--- /dev/null
+++ b/Tests/qu2cu/qu2cu_test.py
@@ -0,0 +1,104 @@
+# Copyright 2023 Behdad Esfahbod. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+import pytest
+
+from fontTools.qu2cu import quadratic_to_curves
+from fontTools.qu2cu.qu2cu import main as qu2cu_main
+from fontTools.qu2cu.benchmark import main as benchmark_main
+
+import os
+import json
+from fontTools.cu2qu import curve_to_quadratic
+
+
+class Qu2CuTest:
+ @pytest.mark.parametrize(
+ "quadratics, expected, tolerance, cubic_only",
+ [
+ (
+ [
+ [(0, 0), (0, 1), (2, 1), (2, 0)],
+ ],
+ [
+ ((0, 0), (0, 4 / 3), (2, 4 / 3), (2, 0)),
+ ],
+ 0.1,
+ True,
+ ),
+ (
+ [
+ [(0, 0), (0, 1), (2, 1), (2, 2)],
+ ],
+ [
+ ((0, 0), (0, 4 / 3), (2, 2 / 3), (2, 2)),
+ ],
+ 0.2,
+ True,
+ ),
+ (
+ [
+ [(0, 0), (0, 1), (1, 1)],
+ [(1, 1), (3, 1), (3, 0)],
+ ],
+ [
+ ((0, 0), (0, 1), (1, 1)),
+ ((1, 1), (3, 1), (3, 0)),
+ ],
+ 0.2,
+ False,
+ ),
+ (
+ [
+ [(0, 0), (0, 1), (1, 1)],
+ [(1, 1), (3, 1), (3, 0)],
+ ],
+ [
+ ((0, 0), (0, 2 / 3), (1 / 3, 1), (1, 1)),
+ ((1, 1), (7 / 3, 1), (3, 2 / 3), (3, 0)),
+ ],
+ 0.2,
+ True,
+ ),
+ ],
+ )
+ def test_simple(self, quadratics, expected, tolerance, cubic_only):
+ expected = [
+ tuple((pytest.approx(p[0]), pytest.approx(p[1])) for p in curve)
+ for curve in expected
+ ]
+
+ c = quadratic_to_curves(quadratics, tolerance, cubic_only)
+ assert c == expected
+
+ def test_roundtrip(self):
+ DATADIR = os.path.join(os.path.dirname(__file__), "..", "cu2qu", "data")
+ with open(os.path.join(DATADIR, "curves.json"), "r") as fp:
+ curves = json.load(fp)
+
+ tolerance = 1
+
+ splines = [curve_to_quadratic(c, tolerance) for c in curves]
+ reconsts = [quadratic_to_curves([spline], tolerance) for spline in splines]
+
+ for curve, reconst in zip(curves, reconsts):
+ assert len(reconst) == 1
+ curve = tuple((pytest.approx(p[0]), pytest.approx(p[1])) for p in curve)
+ assert curve == reconst[0]
+
+ def test_main(self):
+ # Just for coverage
+ qu2cu_main()
+ benchmark_main()