From 63a11cf4620b2848eb91ea4e88fb8bd9d8cf2d53 Mon Sep 17 00:00:00 2001 From: littensy <56808540+littensy@users.noreply.github.com> Date: Sat, 20 Jun 2026 20:32:04 -0700 Subject: [PATCH] test: add cleanup order tests --- packages/charm/test/computed.test.luau | 19 +++++++ packages/charm/test/effect.test.luau | 69 ++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/packages/charm/test/computed.test.luau b/packages/charm/test/computed.test.luau index 8985db2..c0095cf 100644 --- a/packages/charm/test/computed.test.luau +++ b/packages/charm/test/computed.test.luau @@ -198,4 +198,23 @@ test("should trigger effect even computed already dirty", function() assert(v() == 2, `expected 2 for v(), got {v()}`) end) +test("should handle inner effect clearing outer computed's deps on rerun", function() + local src, setSrc = signal(false) + local stopEffect: () -> () + local c = computed(function() + src() + effect(function() + return function() + stopEffect() + end + end) + effect(function() end) + return 0 + end) + stopEffect = effect(function() + c() + end) + setSrc(true) +end) + return {} diff --git a/packages/charm/test/effect.test.luau b/packages/charm/test/effect.test.luau index d697513..c94ec51 100644 --- a/packages/charm/test/effect.test.luau +++ b/packages/charm/test/effect.test.luau @@ -504,4 +504,73 @@ test("recursive effects should run and cleanup in order", function() assert(table.concat(order) == "-3+100", `bad order: {table.concat(order)}`) end) +test("should effects dispose in order", function() + local order: { number } = {} + + local src, setSrc = signal(false) + local stopEffect = effect(function() + src() + for i = 1, 3 do + effect(function() + return function() + table.insert(order, i) + end + end) + end + end) + + assert(#order == 0, "should not cleanup immediately") + setSrc(true) + assert(table.concat(order) == "123", `bad rerun order: {table.concat(order)}`) + table.clear(order) + stopEffect() + assert(table.concat(order) == "123", `bad dispose order: {table.concat(order)}`) + table.clear(order) + setSrc(false) + assert(#order == 0, "should not cleanup after dispose") +end) + +test("should handle inner effect clearing outer effect's deps on rerun", function() + local src, setSrc = signal(false) + local stopEffect: () -> () + stopEffect = effect(function() + src() + effect(function() + return function() + stopEffect() + end + end) + effect(function() end) + end) + setSrc(true) +end) + +test.skip("should handle inner effect cleanup disposing outer effect", function() + local order: { number } = {} + + local src, setSrc = signal(false) + local stopEffect: () -> () + stopEffect = effect(function() + src() + table.insert(order, 0) + for i = 1, 4 do + effect(function() + return function() + table.insert(order, i) + stopEffect() + end + end) + end + end) + assert(table.concat(order) == "0", "should not cleanup immediately") + + table.clear(order) + setSrc(true) + assert(table.concat(order) == "1234", `bad rerun order: {table.concat(order)}`) + + table.clear(order) + setSrc(false) + assert(#order == 0, "should not cleanup after dispose") +end) + return {}