diff --git a/query.go b/query.go index a61f05a..a12519c 100644 --- a/query.go +++ b/query.go @@ -125,10 +125,11 @@ func (q *Query) Iter(w World) iter.Seq[*Entry] { for _, entity := range archetype.Entities() { entry := w.Entry(entity) if entry.entity.IsReady() { + archetype.Unlock() if !yield(entry) { - archetype.Unlock() return } + archetype.Lock() } } archetype.Unlock() diff --git a/query_test.go b/query_test.go index 5f457be..13e8e78 100644 --- a/query_test.go +++ b/query_test.go @@ -23,6 +23,35 @@ var ( orderableTest = donburi.NewComponentType[orderableComponentTest]() ) +func TestQueryInQuery(t *testing.T) { + world := donburi.NewWorld() + world.Create(queryTagA) + world.Create(queryTagC) + world.Create(queryTagA, queryTagB) + world.Create(queryTagA, queryTagB, queryTagC) + + query := donburi.NewQuery(filter.Contains(queryTagA, queryTagB)) + count := 0 + + for entry := range query.Iter(world) { + count++ + if entry.Archetype().Layout().HasComponent(queryTagA) == false { + t.Errorf("PlayerTag should be in ent archetype") + } + innerQuery := donburi.NewQuery(filter.Contains(queryTagA, queryTagB, queryTagC)) + defer func() { + if r := recover(); r != nil { + t.Errorf("panic should not happen") + } + }() + for innerEntry := range innerQuery.Iter(world) { + if innerEntry.Archetype().Layout().HasComponent(queryTagA) == false { + t.Errorf("PlayerTag should be in ent archetype") + } + } + } +} + func TestQuery(t *testing.T) { world := donburi.NewWorld() world.Create(queryTagA) @@ -92,7 +121,7 @@ func BenchmarkQuery_EachOrdered(b *testing.B) { countOrdered := 0 b.Run("Each", func(b *testing.B) { for i := 0; i < b.N; i++ { - for _ = range query.Iter(world) { + for range query.Iter(world) { countNormal++ } }