diff --git a/runtime/tests/interpreter/reference_test.go b/runtime/tests/interpreter/reference_test.go index 5517052b8..d73514ffe 100644 --- a/runtime/tests/interpreter/reference_test.go +++ b/runtime/tests/interpreter/reference_test.go @@ -3291,3 +3291,71 @@ func TestInterpretHostFunctionReferenceInvalidation(t *testing.T) { AssertValuesEqual(t, inter, expectedResult, result) }) } + +func TestInterpretCreatingCircularDependentResource(t *testing.T) { + + t.Parallel() + + t.Run("container container field", func(t *testing.T) { + t.Parallel() + + inter := parseCheckAndInterpret(t, ` + access(all) resource R { + access(mapping Identity) var x: @[R2] + init() { + self.x <- [] + } + } + + access(all) resource R2 { + access(all) let y: @R + init(r: @R) { + self.y <- r + } + } + + access(all) fun main() { + var r <- create R() + var r2 <- create R2(r: <-r) + let ref = &r2.y as auth(Mutate) &R + ref.x.append(<-r2) + } + `) + + _, err := inter.Invoke("main") + require.NoError(t, err) + }) + + t.Run("resource field", func(t *testing.T) { + t.Parallel() + + inter := parseCheckAndInterpret(t, ` + access(all) resource A { + access(self) var b: @B? + init() { + self.b <- nil + } + access(all) fun setB(_ b: @B) { + self.b <-! b + } + } + + access(all) resource B { + access(all) let a: @A + init(_ a: @A) { + self.a <- a + } + } + + access(all) fun main() { + var a <- create A() + var b <- create B(<-a) + let aRef = &b.a as auth(Mutate) &A + aRef.setB(<-b) + } + `) + + _, err := inter.Invoke("main") + require.NoError(t, err) + }) +}