Files
Jedd Morgan 1198f2e2ad Feat(objects): Added Vertex Normals to Mesh (#404)
* Mesh vertex normals

* Moved tests

* test curve
2025-04-25 14:39:04 +00:00

142 lines
3.8 KiB
Python

import pytest
from specklepy.core.api.operations import deserialize, serialize
from specklepy.objects.geometry import Point, Polyline
from specklepy.objects.models.units import Units
from specklepy.objects.primitive import Interval
@pytest.fixture
def open_square_coords():
return [
0.0,
0.0,
0.0, # point 1
1.0,
0.0,
0.0, # point 2
1.0,
1.0,
0.0, # point 3
0.0,
1.0,
0.0, # point 4
]
@pytest.fixture
def closed_square_coords():
return [
0.0,
0.0,
0.0, # point 1
1.0,
0.0,
0.0, # point 2
1.0,
1.0,
0.0, # point 3
0.0,
1.0,
0.0, # point 4
0.0,
0.0,
0.0, # point 5 (same as point 1)
]
@pytest.fixture
def sample_polyline(open_square_coords):
return Polyline(value=open_square_coords, units=Units.m)
def test_polyline_creation(open_square_coords):
polyline = Polyline(value=open_square_coords, units=Units.m)
assert polyline.value == open_square_coords
assert polyline.units == Units.m.value
def test_polyline_domain(sample_polyline):
assert isinstance(sample_polyline.domain, Interval)
assert sample_polyline.domain.start == 0.0
assert sample_polyline.domain.end == 1.0
def test_polyline_is_closed(open_square_coords, closed_square_coords):
open_poly = Polyline(value=open_square_coords, units=Units.m)
closed_poly = Polyline(value=closed_square_coords, units=Units.m)
assert not open_poly.is_closed()
assert closed_poly.is_closed()
def test_polyline_is_closed_with_tolerance(open_square_coords):
almost_closed = open_square_coords + [
0.0,
0.0,
0.001,
] # last point slightly above start
poly = Polyline(value=almost_closed, units=Units.m)
assert not poly.is_closed(tolerance=1e-6)
assert poly.is_closed(tolerance=0.01)
def test_polyline_length_open(sample_polyline):
sample_polyline.length = sample_polyline.calculate_length()
assert sample_polyline.length == 3.0
def test_polyline_length_closed(closed_square_coords):
polyline = Polyline(value=closed_square_coords, units=Units.m)
polyline.length = polyline.calculate_length()
assert polyline.length == 4.0
def test_polyline_get_points(sample_polyline):
points = sample_polyline.get_points()
assert len(points) == 4
assert all(isinstance(p, Point) for p in points)
assert all(p.units == Units.m.value for p in points)
# Create expected points
expected_points = [
Point(x=0.0, y=0.0, z=0.0, units=Units.m),
Point(x=1.0, y=0.0, z=0.0, units=Units.m),
Point(x=1.0, y=1.0, z=0.0, units=Units.m),
Point(x=0.0, y=1.0, z=0.0, units=Units.m),
]
# Check coordinates match
for actual, expected in zip(points, expected_points, strict=False):
assert actual.x == expected.x
assert actual.y == expected.y
assert actual.z == expected.z
def test_polyline_invalid_coordinates():
invalid_coords = [0.0, 0.0, 0.0, 1.0, 1.0] # missing one coordinate
with pytest.raises(ValueError):
polyline = Polyline(value=invalid_coords, units=Units.m)
polyline.get_points()
def test_polyline_units(open_square_coords):
polyline = Polyline(value=open_square_coords, units=Units.m)
assert polyline.units == Units.m.value
polyline.units = "mm"
assert polyline.units == "mm"
def test_polyline_serialization(sample_polyline):
serialized = serialize(sample_polyline)
deserialized = deserialize(serialized)
assert isinstance(deserialized, Polyline)
assert deserialized.value == sample_polyline.value
assert deserialized.units == sample_polyline.units
assert deserialized.domain.start == sample_polyline.domain.start
assert deserialized.domain.end == sample_polyline.domain.end