Примитив с плавающей запятой волшебным образом становится равным 0 при использовании для инициализации PointF или RectF в Kotlin Android

См. следующий модульный тест, который я создал:

import android.graphics.PointF
import org.junit.Assert.assertEquals
import org.junit.Test


class SimpleTest {
    data class A(val x: Float, val y: Float) {
        val origin = PointF(x, y)
        val origin1 by lazy { PointF(x, y) }
    }

    val sut = A(10f, 10f)

    @Test fun succeed() {
        assertEquals(10f, sut.x)
        assertEquals(10f, sut.y)
    }

    @Test fun failed() {
        assertEquals(10f, sut.origin.x)
        assertEquals(10f, sut.origin.y)
    }

    @Test fun failed1() {
        assertEquals(10f, sut.origin1.x)
        assertEquals(10f, sut.origin1.y)
    }
}

Второй и третий тестовый пример завершились ошибкой:

java.lang.AssertionError: 
Expected :10.0
Actual   :0.0

По-видимому, примитивное число с плавающей запятой становится равным 0 при использовании для инициализации PointF, то же самое применяется при использовании для инициализации RectF.

Эта ошибка полностью поразила меня, это ошибка в Котлине?

ОБНОВЛЕНИЕ:

Я подтвердил, что три тестовых примера прошли как инструментальный тест, который доказывает, что заглушка классов Android является причиной сбоя теста. Тем не менее, я все еще наблюдаю ту же проблему в своем приложении, которое не является модульным тестом...

data class Viewport(val x: Float, val y: Float, val w: Int, val h: Int, val scale: Float) {
    val origin = Point2D(x, y)

    val bound = RectF(x, y, x + w * scale, y + h * scale)
    ....
 }

Где-то в приложении у меня есть оператор logcat следующим образом:

Log.d(TAG, "viewport=$viewport, origin=${viewport!!.origin}, bound=${viewport!!.bound}")

И вывод logcat, который я получил, таков:

01-05 12:53:17.376 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.412 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.431 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.448 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.468 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.487 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.501 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)

ОБНОВЛЕНИЕ 2:

Я понял, что это действительно моя вина, что я изменил границу, которая сбрасывала ее на начало координат (0, 0). С Котлином проблем нет.


person Cheng Xu    schedule 05.01.2018    source источник
comment
Возможный дубликат конструктор Android PointF не работает в тесте JUnit   -  person Cheng Xu    schedule 06.01.2018


Ответы (1)


Это работает для простого самодельного класса данных PointF без ошибок:

data class PointF(val x: Float, val y: Float)

android.graphics.PointF здесь не работает должным образом.

person s1m0nw1    schedule 05.01.2018
comment
Да, я подтвердил, что он работает с другой структурой данных, но не с Android PointF и RectF. Вопрос в том, есть ли у других классов такая же проблема и почему это происходит? - person Cheng Xu; 05.01.2018
comment
stackoverflow.com/ вопросы/34010251/ - person s1m0nw1; 05.01.2018
comment
это происходит не только в фиктивном модульном тесте, но и в моем приложении. Я посмотрю, смогу ли я воспроизвести ту же проблему в инструментальном тесте. - person Cheng Xu; 05.01.2018
comment
Вы правы насчет модульного теста, это из-за заглушки, однако у меня такая же проблема в реальном приложении. Я обновил свой вопрос. - person Cheng Xu; 05.01.2018