Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions example/__tests__/nitro.views.harness.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,77 @@ describe('TestView', () => {
expect(view.getNativeDefaultValueSetterCallCount()).toBe(2)
})

it('only brackets transactions that deliver Nitro props with beforeUpdate/afterUpdate', async () => {
const viewRef = deferred<TestViewRef>()
const stableHybridRef = callback((view: TestViewRef) =>
viewRef.resolve(view)
)
const stableSomeCallback = callback(fn())
const renderResult = await render(
// @ts-expect-error TypeScript requires TestView's props, but plain-JS
// consumers can omit them all at runtime - no Nitro props are delivered.
<TestView testID="test-view-update-brackets" style={INITIAL_SIZE} />,
{ timeout: RENDER_TIMEOUT }
)

await renderResult.rerender(
<TestView
testID="test-view-update-brackets"
style={INITIAL_SIZE}
hybridRef={stableHybridRef}
isBlue={false}
hasBeenCalled={false}
colorScheme="dark"
someCallback={stableSomeCallback}
/>
)

const view = await viewRef.promise
// The empty mount delivered no Nitro props, so only the second render
// was a props transaction.
expect(view.getBeforeUpdateCount()).toBe(1)
expect(view.getAfterUpdateCount()).toBe(1)
Comment on lines +454 to +455

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep the Android harness suite passing

On Android, the initial zero-prop mount and the following rerender both pass through HybridTestViewManager.updateState(), which unconditionally invokes beforeUpdate() and afterUpdate() at lines 57–59. Consequently, when this assertion runs the counters are already 2 rather than 1, so the Harness Android job that executes this test via .github/workflows/harness-android.yml will fail on every run. Gate the Android lifecycle calls before landing this assertion, or make the test reflect the behavior supported by each platform.

Useful? React with 👍 / 👎.


const resizedLayout = deferred<LayoutRectangle>()
await renderResult.rerender(
<TestView
testID="test-view-update-brackets"
style={RESIZED_SIZE}
hybridRef={stableHybridRef}
isBlue={false}
hasBeenCalled={false}
colorScheme="dark"
someCallback={stableSomeCallback}
onLayout={({ nativeEvent }) =>
resizedLayout.resolve(nativeEvent.layout)
}
/>
)

const reportedResizedLayout = await resizedLayout.promise
expect(reportedResizedLayout.width).toBeCloseTo(RESIZED_SIZE.width, 0)
expect(reportedResizedLayout.height).toBeCloseTo(RESIZED_SIZE.height, 0)
// A style-only resize changes no Nitro props - not a props transaction.
expect(view.getBeforeUpdateCount()).toBe(1)
expect(view.getAfterUpdateCount()).toBe(1)

await renderResult.rerender(
<TestView
testID="test-view-update-brackets"
style={RESIZED_SIZE}
hybridRef={stableHybridRef}
isBlue={true}
hasBeenCalled={false}
colorScheme="dark"
someCallback={stableSomeCallback}
/>
)

expect(view.isBlue).toBe(true)
expect(view.getBeforeUpdateCount()).toBe(2)
expect(view.getAfterUpdateCount()).toBe(2)
})

it('unmounts and creates a fresh native view when remounted', async () => {
const firstRef = deferred<TestViewRef>()
const renderResult = await render(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ class HybridTestView(
private var onDropViewCount = 0.0
private var isBlueSetterCallCount = 0.0
private var nativeDefaultValueSetterCallCount = 0.0
private var beforeUpdateCount = 0.0
private var afterUpdateCount = 0.0

// Props
override var isBlue: Boolean = false
Expand All @@ -41,6 +43,18 @@ class HybridTestView(

override fun getNativeDefaultValueSetterCallCount(): Double = nativeDefaultValueSetterCallCount

override fun getBeforeUpdateCount(): Double = beforeUpdateCount

override fun getAfterUpdateCount(): Double = afterUpdateCount

override fun beforeUpdate() {
beforeUpdateCount += 1
}

override fun afterUpdate() {
afterUpdateCount += 1
}

override fun someMethod() {
hasBeenCalled = true
someCallback()
Expand Down
18 changes: 18 additions & 0 deletions packages/react-native-nitro-test/ios/HybridTestView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ class HybridTestView: HybridTestViewSpec {
private var onDropViewCount: Double = 0
private var isBlueSetterCallCount: Double = 0
private var nativeDefaultValueSetterCallCount: Double = 0
private var beforeUpdateCount: Double = 0
private var afterUpdateCount: Double = 0

// Props
var isBlue: Bool = false {
Expand Down Expand Up @@ -44,6 +46,22 @@ class HybridTestView: HybridTestViewSpec {
return nativeDefaultValueSetterCallCount
}

func getBeforeUpdateCount() throws -> Double {
return beforeUpdateCount
}

func getAfterUpdateCount() throws -> Double {
return afterUpdateCount
}

func beforeUpdate() {
beforeUpdateCount += 1
}

func afterUpdate() {
afterUpdateCount += 1
}

func someMethod() throws {
hasBeenCalled = true
someCallback()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,16 @@ namespace margelo::nitro::test {
auto __result = method(_javaPart);
return __result;
}
double JHybridTestViewSpec::getBeforeUpdateCount() {
static const auto method = _javaPart->javaClassStatic()->getMethod<double()>("getBeforeUpdateCount");
auto __result = method(_javaPart);
return __result;
}
double JHybridTestViewSpec::getAfterUpdateCount() {
static const auto method = _javaPart->javaClassStatic()->getMethod<double()>("getAfterUpdateCount");
auto __result = method(_javaPart);
return __result;
}
void JHybridTestViewSpec::someMethod() {
static const auto method = _javaPart->javaClassStatic()->getMethod<void()>("someMethod");
method(_javaPart);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ namespace margelo::nitro::test {
double getOnDropViewCount() override;
double getIsBlueSetterCallCount() override;
double getNativeDefaultValueSetterCallCount() override;
double getBeforeUpdateCount() override;
double getAfterUpdateCount() override;
void someMethod() override;

private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@ abstract class HybridTestViewSpec: HybridView() {
@Keep
abstract fun getNativeDefaultValueSetterCallCount(): Double

@DoNotStrip
@Keep
abstract fun getBeforeUpdateCount(): Double

@DoNotStrip
@Keep
abstract fun getAfterUpdateCount(): Double

@DoNotStrip
@Keep
abstract fun someMethod(): Unit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,22 @@ namespace margelo::nitro::test {
auto __value = std::move(__result.value());
return __value;
}
inline double getBeforeUpdateCount() override {
auto __result = _swiftPart.getBeforeUpdateCount();
if (__result.hasError()) [[unlikely]] {
std::rethrow_exception(__result.error());
}
auto __value = std::move(__result.value());
return __value;
}
inline double getAfterUpdateCount() override {
auto __result = _swiftPart.getAfterUpdateCount();
if (__result.hasError()) [[unlikely]] {
std::rethrow_exception(__result.error());
}
auto __value = std::move(__result.value());
return __value;
}
inline void someMethod() override {
auto __result = _swiftPart.someMethod();
if (__result.hasError()) [[unlikely]] {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public protocol HybridTestViewSpec_protocol: HybridObject, HybridView {
func getOnDropViewCount() throws -> Double
func getIsBlueSetterCallCount() throws -> Double
func getNativeDefaultValueSetterCallCount() throws -> Double
func getBeforeUpdateCount() throws -> Double
func getAfterUpdateCount() throws -> Double
func someMethod() throws -> Void
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,30 @@ open class HybridTestViewSpec_cxx {
}
}

@inline(__always)
public final func getBeforeUpdateCount() -> bridge.Result_double_ {
do {
let __result = try self.__implementation.getBeforeUpdateCount()
let __resultCpp = __result
return bridge.create_Result_double_(__resultCpp)
} catch (let __error) {
let __exceptionPtr = __error.toCpp()
return bridge.create_Result_double_(__exceptionPtr)
}
}

@inline(__always)
public final func getAfterUpdateCount() -> bridge.Result_double_ {
do {
let __result = try self.__implementation.getAfterUpdateCount()
let __resultCpp = __result
return bridge.create_Result_double_(__resultCpp)
} catch (let __error) {
let __exceptionPtr = __error.toCpp()
return bridge.create_Result_double_(__exceptionPtr)
}
}

@inline(__always)
public final func someMethod() -> bridge.Result_void_ {
do {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ namespace margelo::nitro::test {
prototype.registerHybridMethod("getOnDropViewCount", &HybridTestViewSpec::getOnDropViewCount);
prototype.registerHybridMethod("getIsBlueSetterCallCount", &HybridTestViewSpec::getIsBlueSetterCallCount);
prototype.registerHybridMethod("getNativeDefaultValueSetterCallCount", &HybridTestViewSpec::getNativeDefaultValueSetterCallCount);
prototype.registerHybridMethod("getBeforeUpdateCount", &HybridTestViewSpec::getBeforeUpdateCount);
prototype.registerHybridMethod("getAfterUpdateCount", &HybridTestViewSpec::getAfterUpdateCount);
prototype.registerHybridMethod("someMethod", &HybridTestViewSpec::someMethod);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ namespace margelo::nitro::test {
virtual double getOnDropViewCount() = 0;
virtual double getIsBlueSetterCallCount() = 0;
virtual double getNativeDefaultValueSetterCallCount() = 0;
virtual double getBeforeUpdateCount() = 0;
virtual double getAfterUpdateCount() = 0;
virtual void someMethod() = 0;

protected:
Expand Down
2 changes: 2 additions & 0 deletions packages/react-native-nitro-test/src/specs/TestView.nitro.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ export interface TestViewMethods extends HybridViewMethods {
getOnDropViewCount(): number
getIsBlueSetterCallCount(): number
getNativeDefaultValueSetterCallCount(): number
getBeforeUpdateCount(): number
getAfterUpdateCount(): number
someMethod(): void
}

Expand Down
Loading