package world import ( "testing" "github.com/stretchr/testify/require" ) // rendererTestCase is a generic table-driven renderer test scaffold. // Replace invoke with the real renderer call once the renderer exists. type rendererTestCase struct { name string // setup prepares the world and optional environment overrides. setup func(t *testing.T, env *rendererTestEnv) // invoke calls the renderer under test. invoke func(t *testing.T, env *rendererTestEnv) // verify checks the produced fake drawer log. verify func(t *testing.T, env *rendererTestEnv) } func runRendererTestCases(t *testing.T, cases []rendererTestCase) { t.Helper() for _, tc := range cases { tc := tc t.Run(tc.name, func(t *testing.T) { env := newRendererTestEnv() if tc.setup != nil { tc.setup(t, env) } require.NotNil(t, tc.invoke, "renderer test case must define invoke") require.NotNil(t, tc.verify, "renderer test case must define verify") tc.invoke(t, env) tc.verify(t, env) }) } } // TestRenderer_Template_PointCases is a scaffold for future point renderer tests. func TestRenderer_Template_PointCases(t *testing.T) { t.Parallel() runRendererTestCases(t, []rendererTestCase{ { name: "point fully inside viewport", setup: func(t *testing.T, env *rendererTestEnv) { worldMustAddPoint(t, env.world, 5, 5) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, { name: "point visible only in horizontal margin copy", setup: func(t *testing.T, env *rendererTestEnv) { env.setViewport(160, 40) worldMustAddPoint(t, env.world, 0.1, 5) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, { name: "point visible only in vertical margin copy", setup: func(t *testing.T, env *rendererTestEnv) { env.setViewport(40, 160) worldMustAddPoint(t, env.world, 5, 0.1) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, { name: "point duplicated across torus corner with independent margins", setup: func(t *testing.T, env *rendererTestEnv) { env.setViewportAndMargins(120, 60, 30, 10) worldMustAddPoint(t, env.world, 0.1, 0.1) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, }) } // TestRenderer_Template_LineCases is a scaffold for future line renderer tests. func TestRenderer_Template_LineCases(t *testing.T) { t.Parallel() runRendererTestCases(t, []rendererTestCase{ { name: "line fully inside viewport", setup: func(t *testing.T, env *rendererTestEnv) { worldMustAddLine(t, env.world, 2, 2, 8, 2) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, { name: "line wrap copy across x edge", setup: func(t *testing.T, env *rendererTestEnv) { env.setViewport(160, 40) worldMustAddLine(t, env.world, 9, 5, 1, 5) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, { name: "line wrap copy across y edge", setup: func(t *testing.T, env *rendererTestEnv) { env.setViewport(40, 160) worldMustAddLine(t, env.world, 5, 9, 5, 1) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, { name: "line tie case uses deterministic wrapped representation", setup: func(t *testing.T, env *rendererTestEnv) { worldMustAddLine(t, env.world, 1, 5, 6, 5) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, }) } // TestRenderer_Template_CircleCases is a scaffold for future circle renderer tests. func TestRenderer_Template_CircleCases(t *testing.T) { t.Parallel() runRendererTestCases(t, []rendererTestCase{ { name: "circle fully inside viewport", setup: func(t *testing.T, env *rendererTestEnv) { worldMustAddCircle(t, env.world, 5, 5, 1) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, { name: "circle duplicated across horizontal edge", setup: func(t *testing.T, env *rendererTestEnv) { env.setViewport(160, 40) worldMustAddCircle(t, env.world, 0.2, 5, 0.5) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, { name: "circle duplicated across vertical edge", setup: func(t *testing.T, env *rendererTestEnv) { env.setViewport(40, 160) worldMustAddCircle(t, env.world, 5, 0.2, 0.5) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, { name: "circle duplicated across corner with asymmetric margins", setup: func(t *testing.T, env *rendererTestEnv) { env.setViewportAndMargins(120, 60, 30, 10) worldMustAddCircle(t, env.world, 0.2, 0.2, 0.5) }, invoke: func(t *testing.T, env *rendererTestEnv) { t.Skip("replace with actual renderer call") }, verify: func(t *testing.T, env *rendererTestEnv) { requireNoDrawerCommands(t, env.drawer) }, }, }) }