62 lines
2.3 KiB
Go
62 lines
2.3 KiB
Go
package world
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"regionio/internal/worldgen"
|
|
)
|
|
|
|
func TestDecorationRegionBlockPredicates(t *testing.T) {
|
|
chunk := NewChunk(0, 0, BiomePlains)
|
|
chunk.SetBlock(4, 20, 4, StateStone)
|
|
chunk.SetBlock(5, 20, 4, StateWater)
|
|
region, err := newDecorationRegion([]*Chunk{chunk})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
set, err := worldgen.LoadFeatureSet()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
position := worldgen.FeaturePosition{X: 4, Y: 21, Z: 4}
|
|
tests := []struct {
|
|
name string
|
|
raw string
|
|
want bool
|
|
}{
|
|
{"block offset", `{"type":"minecraft:matching_blocks","blocks":"minecraft:stone","offset":[0,-1,0]}`, true},
|
|
{"block list", `{"type":"minecraft:matching_blocks","blocks":["minecraft:dirt","minecraft:stone"],"offset":[0,-1,0]}`, true},
|
|
{"air tag", `{"type":"minecraft:matching_block_tag","tag":"minecraft:air"}`, true},
|
|
{"water", `{"type":"minecraft:matching_fluids","fluids":["minecraft:water","minecraft:flowing_water"],"offset":[1,-1,0]}`, true},
|
|
{"all", `{"type":"minecraft:all_of","predicates":[{"type":"minecraft:inside_world_bounds"},{"type":"minecraft:matching_block_tag","tag":"minecraft:air"}]}`, true},
|
|
{"any", `{"type":"minecraft:any_of","predicates":[{"type":"minecraft:matching_blocks","blocks":"minecraft:dirt"},{"type":"minecraft:matching_block_tag","tag":"minecraft:air"}]}`, true},
|
|
{"not", `{"type":"minecraft:not","predicate":{"type":"minecraft:matching_blocks","blocks":"minecraft:stone"}}`, true},
|
|
{"outside", `{"type":"minecraft:inside_world_bounds","offset":[0,-16,0]}`, true},
|
|
}
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
got, err := region.testBlockPredicate(set, json.RawMessage(test.raw), position)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got != test.want {
|
|
t.Fatalf("predicate = %v, want %v", got, test.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDecorationRegionRejectsUnsupportedPredicate(t *testing.T) {
|
|
region, err := newDecorationRegion([]*Chunk{NewChunk(0, 0, BiomePlains)})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
set, err := worldgen.LoadFeatureSet()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := region.testBlockPredicate(set, json.RawMessage(`{"type":"minecraft:would_survive","state":{"Name":"minecraft:oak_sapling"}}`), worldgen.FeaturePosition{}); err == nil {
|
|
t.Fatal("unsupported would_survive succeeded")
|
|
}
|
|
}
|