blob: d1439dbc5a2ccd2223e18795c49c9041981c02f5 [file] [log] [blame]
/*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.camera.camera2.pipe.testing
import android.os.Build
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.junit.runners.model.FrameworkMethod
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.robolectric.internal.bytecode.InstrumentationConfiguration
/**
* A [RobolectricTestRunner] for [androidx.camera.camera2.pipe] unit tests.
*
* This test runner disables instrumentation for the [androidx.camera.camera2.pipe] and
* [androidx.camera.camera2.pipe.testing] packages.
*
* Robolectric tries to instrument Kotlin classes, and it throws errors when it encounters
* companion objects, constructors with default values for parameters, and data classes with
* inline classes. We don't need shadowing of our classes because we want to use the actual
* objects in our tests.
*/
public class RobolectricCameraPipeTestRunner(testClass: Class<*>) :
RobolectricTestRunner(testClass) {
override fun createClassLoaderConfig(method: FrameworkMethod?): InstrumentationConfiguration {
val builder = InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
builder.doNotInstrumentPackage("androidx.camera.camera2.pipe")
builder.doNotInstrumentPackage("androidx.camera.camera2.pipe.testing")
return builder.build()
}
}
@JvmInline
public value class TestValue(public val value: String)
public data class TestData(
val value1: TestValue,
val value2: String
)
@RunWith(JUnit4::class)
public class DataWithInlineClassJUnitTest {
@Test
public fun inlineClassesAreEqualInJUnit() {
assertThat(TestValue("42")).isEqualTo(
TestValue("42")
)
}
@Test
public fun dataWithInlineClassesAreEqualInJUnit() {
assertThat(
TestData(
value1 = TestValue("Test value #1"),
value2 = "Test value #2"
)
).isEqualTo(
TestData(
value1 = TestValue("Test value #1"),
value2 = "Test value #2"
)
)
}
}
@RunWith(RobolectricCameraPipeTestRunner::class)
@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
public class DataWithInlineClassRobolectricTest {
@Test
public fun inlineClassesAreEqualInRobolectric() {
assertThat(TestValue("42")).isEqualTo(
TestValue("42")
)
}
@Test
public fun dataWithInlineClassesAreEqualInRobolectric() {
assertThat(
TestData(
value1 = TestValue("Test value #1"),
value2 = "Test value #2"
)
).isEqualTo(
TestData(
value1 = TestValue("Test value #1"),
value2 = "Test value #2"
)
)
}
}