ui: basic map scroller
This commit is contained in:
@@ -0,0 +1,219 @@
|
||||
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)
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user