Skip to content

Commit 9267fbf

Browse files
committed
tests: add better tests
1 parent 8981a52 commit 9267fbf

File tree

2 files changed

+87
-72
lines changed

2 files changed

+87
-72
lines changed

manim/mobject/svg/text_mobject.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from ...mobject.types.vectorized_mobject import VGroup
2121
from ...utils.config_ops import digest_config
2222

23-
2423
TEXT_MOB_SCALE_FACTOR = 0.05
2524

2625

@@ -391,7 +390,6 @@ def text2svg1(self):
391390
surface.finish()
392391
return file_name
393392

394-
395393
class Paragraph(VGroup):
396394
r"""Display a paragraph of text.
397395
@@ -684,7 +682,7 @@ def __init__(self, text: str, **config):
684682
if self.height is None and self.width is None:
685683
self.scale(TEXT_MOB_SCALE_FACTOR)
686684

687-
def remove_last_M(self, file_name: str):
685+
def remove_last_M(self, file_name: str): # pylint: disable=invalid-name
688686
"""Internally used. Use to format the rendered SVG files."""
689687
with open(file_name, "r") as fpr:
690688
content = fpr.read()
@@ -719,13 +717,13 @@ def full2short(self, config):
719717
for kwargs in [config, self.CONFIG]:
720718
if "text2color" in kwargs:
721719
kwargs["t2c"] = kwargs.pop("text2color")
722-
if kwargs.__contains__("text2font"):
720+
if "text2font" in kwargs:
723721
kwargs["t2f"] = kwargs.pop("text2font")
724-
if kwargs.__contains__("text2gradient"):
722+
if "text2gradient" in kwargs:
725723
kwargs["t2g"] = kwargs.pop("text2gradient")
726-
if kwargs.__contains__("text2slant"):
724+
if "text2slant" in kwargs:
727725
kwargs["t2s"] = kwargs.pop("text2slant")
728-
if kwargs.__contains__("text2weight"):
726+
if "text2weight" in kwargs:
729727
kwargs["t2w"] = kwargs.pop("text2weight")
730728

731729
def set_color_by_t2c(self, t2c=None):
@@ -736,7 +734,8 @@ def set_color_by_t2c(self, t2c=None):
736734
self.chars[start:end].set_color(color)
737735

738736
def set_color_by_t2g(self, t2g=None):
739-
"""Internally used. Sets gradient colors for specified strings. Behaves similarly to ``set_color_by_t2c``."""
737+
"""Internally used. Sets gradient colors for specified
738+
strings. Behaves similarly to ``set_color_by_t2c``."""
740739
t2g = t2g if t2g else self.t2g
741740
for word, gradient in list(t2g.items()):
742741
for start, end in self.find_indexes(word, self.original_text):
@@ -842,10 +841,11 @@ def text2svg(self):
842841
"""Internally used function.
843842
Convert the text to SVG using Pango
844843
"""
845-
# anti-aliasing
846844
size = self.size * 10
847845
line_spacing = self.line_spacing * 10
848846
dir_name = file_writer_config["text_dir"]
847+
if not os.path.exists(dir_name):
848+
os.makedirs(dir_name)
849849
hash_name = self.text2hash()
850850
file_name = os.path.join(dir_name, hash_name) + ".svg"
851851
if os.path.exists(file_name):

tests/test_pango.py

Lines changed: 78 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,139 @@
1-
from manim import PangoText, START_X, START_Y, SVGMobject
1+
"""Tests :class:`PangoText` by comparing SVG files created.
2+
"""
23
import os
4+
import re
5+
36
import cairocffi
47
import pangocairocffi
58
import pangocffi
9+
from manim import START_X, START_Y, PangoText, SVGMobject
610

7-
rtl_text = """صباح الخير
11+
RTL_TEXT: str = """صباح الخير
812
مرحبا جميعا"""
913

10-
width = 600
11-
height = 400
14+
WIDTH: int = 600
15+
HEIGTH: int = 400
16+
folder: str = os.path.abspath(os.path.join("media", "texts"))
17+
filename: str = os.path.join(folder, "hello.svg")
18+
19+
20+
def remove_last_M(file_path: str) -> None: # pylint: disable=invalid-name
21+
"""Format SVG file so that it can be compared"""
22+
with open(file_path, "r") as fpr:
23+
content = fpr.read()
24+
content = re.sub(r'Z M [^A-Za-z]*? "\/>', 'Z "/>', content)
25+
with open(file_path, "w") as fpw:
26+
fpw.write(content)
27+
28+
29+
def compare_SVGObject_with_PangoText( # pylint: disable=invalid-name
30+
text: PangoText, svg_path: str
31+
) -> bool:
32+
"""Checks for the path_string formed by PangoText and Formed SVG file.
33+
Uses SVGMobject as it parses the SVG and returns the path_string
34+
"""
35+
remove_last_M(svg_path) # to prevent issue displaying
36+
svg = SVGMobject(svg_path)
37+
assert len(text.submobjects) == len(svg.submobjects)
38+
assert (text.points == svg.points).all()
39+
for i in range(len(text.submobjects)):
40+
assert text.submobjects[i].path_string == svg.submobjects[i].path_string
41+
assert (
42+
text.submobjects[i].sheen_direction == svg.submobjects[i].sheen_direction
43+
).all()
44+
assert (
45+
text.submobjects[i].stroke_rgbas == svg.submobjects[i].stroke_rgbas
46+
).all()
47+
return True
1248

1349

14-
def test_general_text_svgobject():
15-
"""Checks number of submobjects generated when directly called using ``SVGMobject``"""
50+
def test_general_text_svgobject() -> None:
51+
"""Checks number of submobjects generated when directly
52+
called using ``SVGMobject``
53+
"""
1654
text = "hello"
1755
size = 1
18-
folder = os.path.abspath(os.path.join("media", "texts"))
19-
if not os.path.exists(folder):
20-
os.makedirs(folder)
21-
filename = os.path.join(folder, "hello.svg")
22-
a = PangoText(text, size=10)
23-
pangoManim = os.path.join(folder, a.text2hash() + ".svg")
24-
surface = cairocffi.SVGSurface(filename, width, height)
56+
temp_pango_text = PangoText(text, size=size)
57+
surface = cairocffi.SVGSurface(filename, WIDTH, HEIGTH)
2558
context = cairocffi.Context(surface)
2659
context.move_to(START_X, START_Y)
2760
layout = pangocairocffi.create_layout(context)
28-
layout.set_width(pangocffi.units_from_double(width))
61+
layout.set_width(pangocffi.units_from_double(WIDTH))
2962
fontdesc = pangocffi.FontDescription()
3063
fontdesc.set_size(pangocffi.units_from_double(size * 10))
3164
layout.set_font_description(fontdesc)
3265
layout.set_text(text)
3366
pangocairocffi.show_layout(context, layout)
3467
surface.finish()
35-
b = SVGMobject(filename)
36-
assert len(a.submobjects) == len(b.submobjects)
68+
assert compare_SVGObject_with_PangoText(temp_pango_text, filename)
3769

3870

39-
def test_rtl_text_text_svgobject():
40-
"""Checks number of submobjects generated when directly called using ``SVGMobject``"""
71+
def test_rtl_text_to_svgobject() -> None:
72+
"""Checks number of submobjects generated when directly
73+
called using ``SVGMobject``"""
4174
size = 1
42-
text = rtl_text
43-
folder = os.path.abspath(os.path.join("media", "texts"))
44-
if not os.path.exists(folder):
45-
os.makedirs(folder)
46-
filename = os.path.join(folder, "hello.svg")
47-
a = PangoText(text, size=1)
48-
pangoManim = os.path.join(folder, a.text2hash() + ".svg")
49-
surface = cairocffi.SVGSurface(filename, width, height)
75+
text = RTL_TEXT.replace("\n", "")
76+
temp_pango_text = PangoText(text, size=1)
77+
surface = cairocffi.SVGSurface(filename, WIDTH, HEIGTH)
5078
context = cairocffi.Context(surface)
5179
context.move_to(START_X, START_Y)
5280
layout = pangocairocffi.create_layout(context)
53-
layout.set_width(pangocffi.units_from_double(width))
81+
layout.set_width(pangocffi.units_from_double(WIDTH))
5482
fontdesc = pangocffi.FontDescription()
5583
fontdesc.set_size(pangocffi.units_from_double(size * 10))
5684
layout.set_font_description(fontdesc)
5785
layout.set_text(text)
5886
pangocairocffi.show_layout(context, layout)
5987
surface.finish()
60-
b = SVGMobject(filename)
61-
assert len(a.submobjects) == len(b.submobjects)
88+
assert compare_SVGObject_with_PangoText(temp_pango_text, filename)
6289

6390

64-
def test_font_face():
91+
def test_font_face() -> None:
6592
"""Checks font face using submobject len"""
6693
size = 1
67-
text = rtl_text
94+
text = RTL_TEXT.replace("\n", "")
6895
font_face = "sans"
69-
folder = os.path.abspath(os.path.join("media", "texts"))
70-
if not os.path.exists(folder):
71-
os.makedirs(folder)
72-
filename = os.path.join(folder, "hello.svg")
73-
a = PangoText(text, size=1, font=font_face)
74-
pangoManim = os.path.join(folder, a.text2hash() + ".svg")
75-
surface = cairocffi.SVGSurface(filename, width, height)
96+
temp_pango_text = PangoText(text, size=1, font=font_face)
97+
surface = cairocffi.SVGSurface(filename, WIDTH, HEIGTH)
7698
context = cairocffi.Context(surface)
7799
context.move_to(START_X, START_Y)
78100
layout = pangocairocffi.create_layout(context)
79-
layout.set_width(pangocffi.units_from_double(width))
101+
layout.set_width(pangocffi.units_from_double(WIDTH))
80102
fontdesc = pangocffi.FontDescription()
81103
fontdesc.set_family(font_face)
82104
fontdesc.set_size(pangocffi.units_from_double(size * 10))
83105
layout.set_font_description(fontdesc)
84106
layout.set_text(text)
85107
pangocairocffi.show_layout(context, layout)
86108
surface.finish()
87-
b = SVGMobject(filename)
88-
assert len(a.submobjects) == len(b.submobjects)
109+
assert compare_SVGObject_with_PangoText(temp_pango_text, filename)
89110

90111

91-
def test_whether_svg_file_created():
112+
def test_whether_svg_file_created() -> None:
92113
"""Checks Whether SVG file is created in desired location"""
93-
a = PangoText("hello", size=1)
94-
folder = os.path.abspath(os.path.join("media", "texts"))
95-
if not os.path.exists(folder):
96-
os.makedirs(folder)
97-
theoPath = os.path.abspath(os.path.join(folder, a.text2hash() + ".svg"))
98-
actualPath = os.path.abspath(a.text2svg())
99-
assert theoPath == actualPath
114+
temp_pango_text = PangoText("hello", size=1)
115+
theo_path = os.path.abspath(
116+
os.path.join(folder, temp_pango_text.text2hash() + ".svg")
117+
)
118+
actual_path = os.path.abspath(temp_pango_text.text2svg())
119+
assert theo_path == actual_path
100120

101121

102-
def test_tabs_replace():
103-
"""Checks whether are there in end svg image. Pango should handle tabs and line breaks."""
122+
def test_tabs_replace() -> None:
123+
"""Checks whether are there in end svg image.
124+
Pango should handle tabs and line breaks."""
104125
size = 1
105-
folder = os.path.abspath(os.path.join("media", "texts"))
106-
if not os.path.exists(folder):
107-
os.makedirs(folder)
108-
a = PangoText("hello\thi\nf")
109-
assert a.text == "hellohif"
110-
pangoManim = os.path.join(folder, a.text2hash() + ".svg")
111-
filename = os.path.join(folder, "hello.svg")
112-
surface = cairocffi.SVGSurface(filename, width, height)
126+
temp_pango_text = PangoText("hello\thi\nf")
127+
assert temp_pango_text.text == "hellohif"
128+
surface = cairocffi.SVGSurface(filename, WIDTH, HEIGTH)
113129
context = cairocffi.Context(surface)
114130
context.move_to(START_X, START_Y)
115131
layout = pangocairocffi.create_layout(context)
116-
layout.set_width(pangocffi.units_from_double(width))
132+
layout.set_width(pangocffi.units_from_double(WIDTH))
117133
fontdesc = pangocffi.FontDescription()
118134
fontdesc.set_size(pangocffi.units_from_double(size * 10))
119135
layout.set_font_description(fontdesc)
120-
layout.set_text("hello\thi\nf")
136+
layout.set_text("hellohif")
121137
pangocairocffi.show_layout(context, layout)
122138
surface.finish()
123-
b = SVGMobject(filename)
124-
assert len(a.submobjects) == len(b.submobjects)
139+
assert compare_SVGObject_with_PangoText(temp_pango_text, filename)

0 commit comments

Comments
 (0)