package com.fireworksdk.bridge.components.videofeed import com.fireworksdk.bridge.components.videofeed.FWAutosizingState.Pass import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Test class FWAutosizingStateTest { private val state = FWAutosizingState() private fun settle(height: Int = 900, width: Int = 400) { repeat(2) { assertEquals(Pass.FORCE, state.nextPass(width, false)) state.didMeasure(height) } assertEquals(Pass.NORMAL, state.nextPass(width, false)) } @Test fun zeroWidthDefersTheInitialMeasurement() { assertEquals(Pass.NONE, state.nextPass(0, false)) settle() } @Test fun stableContentKeepsNormalLayoutWithoutForcingTheSubtree() { settle() repeat(120) { assertEquals(Pass.NORMAL, state.nextPass(400, false)) } } @Test fun explicitInvalidationRequiresConvergenceWithinTheNewRound() { settle() state.invalidate() settle() } @Test fun widthChangeMeasuresAgainEvenWithoutALayoutRequest() { settle() settle(height = 1200, width = 300) } @Test fun asyncLayoutRequestAfterIdleStartsANewRound() { settle() assertEquals(Pass.FORCE, state.nextPass(400, true)) state.didMeasure(1500) assertEquals(Pass.FORCE, state.nextPass(400, false)) state.didMeasure(1500) assertEquals(Pass.NORMAL, state.nextPass(400, false)) } @Test fun repeatedLayoutRequestsCannotContinuouslyRearmForcedPasses() { repeat(8) { index -> assertEquals(Pass.FORCE, state.nextPass(400, true)) state.didMeasure(900 + index) } repeat(20) { index -> assertEquals(Pass.NORMAL, state.nextPass(400, true)) state.didMeasure(1000 + index) } assertEquals(Pass.NORMAL, state.nextPass(400, false)) assertEquals(Pass.FORCE, state.nextPass(400, true)) } @Test fun contentChangeCanRestartAnExhaustedRound() { repeat(8) { index -> assertEquals(Pass.FORCE, state.nextPass(400, true)) state.didMeasure(index) } state.invalidate() settle() } @Test fun loadingZerosDoNotCollapseThePlaceholderOrPreviousContent() { assertNull(state.heightToReport(0, 3f)) assertEquals(300f, state.heightToReport(900, 3f)) state.setContentEmpty(false) assertNull(state.heightToReport(0, 3f)) assertNull(state.heightToReport(900, 3f)) } @Test fun confirmedEmptyReportsZeroDespiteAStaleNativeHeight() { assertEquals(300f, state.heightToReport(900, 3f)) state.setContentEmpty(true) assertEquals(0f, state.heightToReport(900, 3f)) assertNull(state.heightToReport(0, 3f)) state.setContentEmpty(false) assertNull(state.heightToReport(0, 3f)) assertEquals(300f, state.heightToReport(900, 3f)) } @Test fun initiallyEmptyFeedCollapsesOnlyOnce() { state.setContentEmpty(true) assertEquals(0f, state.heightToReport(0, 3f)) state.invalidate() assertNull(state.heightToReport(0, 3f)) } @Test fun deduplicatesRoundedDpInsteadOfPixels() { assertEquals(334f, state.heightToReport(1000, 3f)) assertNull(state.heightToReport(1001, 3f)) assertNull(state.heightToReport(1002, 3f)) assertEquals(335f, state.heightToReport(1003, 3f)) } @Test fun densityChangeCanReportANewHeightWithUnchangedPixels() { assertEquals(300f, state.heightToReport(900, 3f)) assertEquals(450f, state.heightToReport(900, 2f)) } @Test fun reattachmentRemeasuresWithoutRepeatingTheSameBridgeEvent() { settle() assertEquals(300f, state.heightToReport(900, 3f)) state.invalidate() settle() assertNull(state.heightToReport(900, 3f)) } }