1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.tools.common.flicker.subject 18 19 import android.tools.common.Timestamp 20 import android.tools.common.flicker.assertions.Fact 21 import android.tools.common.flicker.subject.exceptions.ExceptionMessageBuilder 22 import android.tools.common.flicker.subject.exceptions.InvalidPropertyException 23 import android.tools.common.io.Reader 24 25 /** Subject for flicker checks */ 26 data class CheckSubject<T>( 27 private val actualValue: T?, 28 private val timestamp: Timestamp, 29 private val extraFacts: List<Fact>, 30 private val reader: Reader?, 31 private val lazyMessage: () -> String, 32 ) { 33 private val exceptionMessageBuilder: ExceptionMessageBuilder 34 get() { 35 val builder = 36 ExceptionMessageBuilder() 37 .setTimestamp(timestamp) 38 .addExtraDescription(*extraFacts.toTypedArray()) 39 if (reader != null) { 40 builder.setReader(reader) 41 } 42 return builder 43 } 44 isEqualnull45 fun isEqual(expectedValue: T?) { 46 if (actualValue != expectedValue) { 47 val errorMsgBuilder = 48 exceptionMessageBuilder 49 .setMessage(lazyMessage.invoke()) 50 .setExpected(expectedValue) 51 .setActual(actualValue) 52 throw InvalidPropertyException(errorMsgBuilder) 53 } 54 } 55 isNotEqualnull56 fun isNotEqual(expectedValue: T?) { 57 if (actualValue == expectedValue) { 58 val errorMsgBuilder = 59 exceptionMessageBuilder 60 .setMessage(lazyMessage.invoke()) 61 .setExpected("Different from $expectedValue") 62 .setActual(actualValue) 63 throw InvalidPropertyException(errorMsgBuilder) 64 } 65 } 66 isNullnull67 fun isNull() { 68 if (actualValue != null) { 69 val errorMsgBuilder = 70 exceptionMessageBuilder 71 .setMessage(lazyMessage.invoke()) 72 .setExpected(null) 73 .setActual(actualValue) 74 throw InvalidPropertyException(errorMsgBuilder) 75 } 76 } 77 isNotNullnull78 fun isNotNull() { 79 if (actualValue == null) { 80 val errorMsgBuilder = 81 exceptionMessageBuilder 82 .setMessage(lazyMessage.invoke()) 83 .setExpected("Not null") 84 .setActual(null) 85 throw InvalidPropertyException(errorMsgBuilder) 86 } 87 } 88 isLowernull89 fun isLower(expectedValue: T?) { 90 if ( 91 actualValue == null || 92 expectedValue == null || 93 (actualValue as Comparable<T>) >= expectedValue 94 ) { 95 val errorMsgBuilder = 96 exceptionMessageBuilder 97 .setMessage(lazyMessage.invoke()) 98 .setExpected("Lower than $expectedValue") 99 .setActual(actualValue) 100 throw InvalidPropertyException(errorMsgBuilder) 101 } 102 } 103 isLowerOrEqualnull104 fun isLowerOrEqual(expectedValue: T?) { 105 if ( 106 actualValue == null || 107 expectedValue == null || 108 (actualValue as Comparable<T>) > expectedValue 109 ) { 110 val errorMsgBuilder = 111 exceptionMessageBuilder 112 .setMessage(lazyMessage.invoke()) 113 .setExpected("Lower or equal to $expectedValue") 114 .setActual(actualValue) 115 throw InvalidPropertyException(errorMsgBuilder) 116 } 117 } 118 isGreaternull119 fun isGreater(expectedValue: T) { 120 if ( 121 actualValue == null || 122 expectedValue == null || 123 (actualValue as Comparable<T>) <= expectedValue 124 ) { 125 val errorMsgBuilder = 126 exceptionMessageBuilder 127 .setMessage(lazyMessage.invoke()) 128 .setExpected("Greater than $expectedValue") 129 .setActual(actualValue) 130 throw InvalidPropertyException(errorMsgBuilder) 131 } 132 } 133 isGreaterOrEqualnull134 fun isGreaterOrEqual(expectedValue: T) { 135 if ( 136 actualValue == null || 137 expectedValue == null || 138 (actualValue as Comparable<T>) < expectedValue 139 ) { 140 val errorMsgBuilder = 141 exceptionMessageBuilder 142 .setMessage(lazyMessage.invoke()) 143 .setExpected("Greater or equal to $expectedValue") 144 .setActual(actualValue) 145 throw InvalidPropertyException(errorMsgBuilder) 146 } 147 } 148 containsnull149 fun <U> contains(expectedValue: U) { 150 if (actualValue !is List<*> || !(actualValue as List<U>).contains(expectedValue)) { 151 val errorMsgBuilder = 152 exceptionMessageBuilder 153 .setMessage(lazyMessage.invoke()) 154 .setExpected("Contain $expectedValue") 155 .setActual(actualValue) 156 throw InvalidPropertyException(errorMsgBuilder) 157 } 158 } 159 } 160