220 lines
6.3 KiB
Go
220 lines
6.3 KiB
Go
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)
|
|
},
|
|
},
|
|
})
|
|
}
|