Source code for picogl.tests.test_binding

"""Tests for gl binding strategies."""

import unittest
from types import SimpleNamespace
from unittest.mock import call, patch

from OpenGL.raw.GL.VERSION.GL_1_1 import GL_TRIANGLES

from picogl.backend.geometry.factory import LegacyBinding, ModernBinding
from picogl.backend.geometry.legacy_mesh import LegacyMesh
from picogl.backend.gl.enums import GLNumeric
from picogl.backend.gl.state.client import GLClientState


[docs] class TestLegacyBinding(unittest.TestCase):
[docs] def test_bind_mesh_enables_texcoord_array_not_color(self): binding = LegacyBinding() mesh = SimpleNamespace( vertices=object(), normals=None, colors=None, texcoords=object(), indices=None, ) with ( patch( "picogl.backend.geometry.legacy_mesh_binding.gl_enable_legacy_client_state" ) as enable, patch( "picogl.backend.geometry.legacy_mesh_binding.gl_vertex_array_pointer" ), patch( "picogl.backend.geometry.legacy_mesh_binding.gl_texcoord_array_pointer" ) as texcoord_pointer, patch( "picogl.backend.geometry.legacy_mesh_binding.gl_color_array_pointer" ) as color_pointer, ): binding.bind_mesh(mesh) enable.assert_has_calls( [ call(GLClientState.VERTEX), call(GLClientState.TEXCOORD), ] ) texcoord_pointer.assert_called_once_with(pointer=mesh.texcoords) color_pointer.assert_not_called()
[docs] def test_bind_mesh_enables_all_client_arrays_when_present(self): binding = LegacyBinding() mesh = SimpleNamespace( vertices=object(), normals=object(), colors=object(), texcoords=object(), indices=[0, 1, 2], ) with ( patch( "picogl.backend.geometry.legacy_mesh_binding.gl_enable_legacy_client_state" ) as enable, patch( "picogl.backend.geometry.legacy_mesh_binding.gl_vertex_array_pointer" ), patch( "picogl.backend.geometry.legacy_mesh_binding.gl_normal_array_pointer" ), patch("picogl.backend.geometry.legacy_mesh_binding.gl_color_array_pointer"), patch( "picogl.backend.geometry.legacy_mesh_binding.gl_texcoord_array_pointer" ), ): binding.bind_mesh(mesh) self.assertEqual( [c.args[0] for c in enable.call_args_list], [ GLClientState.VERTEX, GLClientState.NORMAL, GLClientState.COLOR, GLClientState.TEXCOORD, ], )
[docs] def test_draw_issues_indexed_draw_when_indices_present(self): binding = LegacyBinding() mesh = SimpleNamespace(indices=[0, 1, 2]) binding._last_gpu_mesh = LegacyMesh(mesh) with patch( "picogl.backend.geometry.legacy_mesh.gl_draw_elements" ) as draw_elements: binding.draw(mesh, GL_TRIANGLES) draw_elements.assert_called_once_with( 3, GLNumeric.UNSIGNED_INT, GL_TRIANGLES, pointer=mesh.indices )
[docs] class TestModernBinding(unittest.TestCase):
[docs] def test_draw_uses_index_count_from_mesh(self): binding = ModernBinding() mesh = SimpleNamespace(ebo=42, index_count=9) with patch( "picogl.backend.geometry.modern_mesh.gl_draw_elements" ) as draw_elements: binding.bind_mesh(mesh) binding.draw(mesh, GL_TRIANGLES) draw_elements.assert_called_once_with( 9, GLNumeric.UNSIGNED_INT, GL_TRIANGLES, pointer=None )
if __name__ == "__main__": unittest.main()