1 /* 2 * Copyright (C) 2014 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 import java.lang.reflect.Method; 18 19 public class Main { 20 21 public static void main(String[] args) throws Exception { 22 cmpLong(); 23 cmpFloat(); 24 cmpDouble(); 25 } 26 27 private static void cmpLong() throws Exception { 28 expectLt(3L, 5L); 29 expectGt(5L, 3L); 30 expectLt(Long.MIN_VALUE, Long.MAX_VALUE); 31 expectGt(Long.MAX_VALUE, Long.MIN_VALUE); 32 33 expectEquals(0, smaliCmpLong(0L, 0L)); 34 expectEquals(0, smaliCmpLong(1L, 1L)); 35 expectEquals(-1, smaliCmpLong(1L, 2L)); 36 expectEquals(1, smaliCmpLong(2L, 1L)); 37 expectEquals(-1, smaliCmpLong(Long.MIN_VALUE, Long.MAX_VALUE)); 38 expectEquals(1, smaliCmpLong(Long.MAX_VALUE, Long.MIN_VALUE)); 39 expectEquals(0, smaliCmpLong(Long.MIN_VALUE, Long.MIN_VALUE)); 40 expectEquals(0, smaliCmpLong(Long.MAX_VALUE, Long.MAX_VALUE)); 41 } 42 43 private static void cmpFloat() throws Exception { 44 expectLt(3.1F, 5.1F); 45 expectGt(5.1F, 3.1F); 46 expectLt(Float.MIN_VALUE, Float.MAX_VALUE); 47 expectGt(Float.MAX_VALUE, Float.MIN_VALUE); 48 expectFalse(3.1F, Float.NaN); 49 expectFalse(Float.NaN, 3.1F); 50 51 expectEquals(0, smaliCmpGtFloat(0F, 0F)); 52 expectEquals(0, smaliCmpGtFloat(1F, 1F)); 53 expectEquals(-1, smaliCmpGtFloat(1.1F, 2.1F)); 54 expectEquals(1, smaliCmpGtFloat(2.1F, 1.1F)); 55 expectEquals(-1, smaliCmpGtFloat(Float.MIN_VALUE, Float.MAX_VALUE)); 56 expectEquals(1, smaliCmpGtFloat(Float.MAX_VALUE, Float.MIN_VALUE)); 57 expectEquals(0, smaliCmpGtFloat(Float.MIN_VALUE, Float.MIN_VALUE)); 58 expectEquals(0, smaliCmpGtFloat(Float.MAX_VALUE, Float.MAX_VALUE)); 59 expectEquals(1, smaliCmpGtFloat(5F, Float.NaN)); 60 expectEquals(1, smaliCmpGtFloat(Float.NaN, 5F)); 61 62 expectEquals(0, smaliCmpLtFloat(0F, 0F)); 63 expectEquals(0, smaliCmpLtFloat(1F, 1F)); 64 expectEquals(-1, smaliCmpLtFloat(1.1F, 2.1F)); 65 expectEquals(1, smaliCmpLtFloat(2.1F, 1.1F)); 66 expectEquals(-1, smaliCmpLtFloat(Float.MIN_VALUE, Float.MAX_VALUE)); 67 expectEquals(1, smaliCmpLtFloat(Float.MAX_VALUE, Float.MIN_VALUE)); 68 expectEquals(0, smaliCmpLtFloat(Float.MIN_VALUE, Float.MIN_VALUE)); 69 expectEquals(0, smaliCmpLtFloat(Float.MAX_VALUE, Float.MAX_VALUE)); 70 expectEquals(-1, smaliCmpLtFloat(5F, Float.NaN)); 71 expectEquals(-1, smaliCmpLtFloat(Float.NaN, 5F)); 72 } 73 74 private static void cmpDouble() throws Exception { 75 expectLt(3.1D, 5.1D); 76 expectGt(5.1D, 3.1D); 77 expectLt(Double.MIN_VALUE, Double.MAX_VALUE); 78 expectGt(Double.MAX_VALUE, Double.MIN_VALUE); 79 expectFalse(3.1D, Double.NaN); 80 expectFalse(Double.NaN, 3.1D); 81 82 expectEquals(0, smaliCmpGtDouble(0D, 0D)); 83 expectEquals(0, smaliCmpGtDouble(1D, 1D)); 84 expectEquals(-1, smaliCmpGtDouble(1.1D, 2.1D)); 85 expectEquals(1, smaliCmpGtDouble(2.1D, 1.1D)); 86 expectEquals(-1, smaliCmpGtDouble(Double.MIN_VALUE, Double.MAX_VALUE)); 87 expectEquals(1, smaliCmpGtDouble(Double.MAX_VALUE, Double.MIN_VALUE)); 88 expectEquals(0, smaliCmpGtDouble(Double.MIN_VALUE, Double.MIN_VALUE)); 89 expectEquals(0, smaliCmpGtDouble(Double.MAX_VALUE, Double.MAX_VALUE)); 90 expectEquals(1, smaliCmpGtDouble(5D, Double.NaN)); 91 expectEquals(1, smaliCmpGtDouble(Double.NaN, 5D)); 92 93 expectEquals(0, smaliCmpLtDouble(0D, 0D)); 94 expectEquals(0, smaliCmpLtDouble(1D, 1D)); 95 expectEquals(-1, smaliCmpLtDouble(1.1D, 2.1D)); 96 expectEquals(1, smaliCmpLtDouble(2.1D, 1.1D)); 97 expectEquals(-1, smaliCmpLtDouble(Double.MIN_VALUE, Double.MAX_VALUE)); 98 expectEquals(1, smaliCmpLtDouble(Double.MAX_VALUE, Double.MIN_VALUE)); 99 expectEquals(0, smaliCmpLtDouble(Double.MIN_VALUE, Double.MIN_VALUE)); 100 expectEquals(0, smaliCmpLtDouble(Double.MAX_VALUE, Double.MAX_VALUE)); 101 expectEquals(-1, smaliCmpLtDouble(5D, Double.NaN)); 102 expectEquals(-1, smaliCmpLtDouble(Float.NaN, 5D)); 103 } 104 105 static boolean $opt$lt(long a, long b) { 106 return a < b; 107 } 108 109 static boolean $opt$lt(float a, float b) { 110 return a < b; 111 } 112 113 static boolean $opt$lt(double a, double b) { 114 return a < b; 115 } 116 117 static boolean $opt$gt(long a, long b) { 118 return a > b; 119 } 120 121 static boolean $opt$gt(float a, float b) { 122 return a > b; 123 } 124 125 static boolean $opt$gt(double a, double b) { 126 return a > b; 127 } 128 129 // Wrappers around methods located in file cmp.smali. 130 131 private static int smaliCmpLong(long a, long b) throws Exception { 132 Class<?> c = Class.forName("TestCmp"); 133 Method m = c.getMethod("$opt$CmpLong", long.class, long.class); 134 int result = (Integer)m.invoke(null, a, b); 135 return result; 136 } 137 138 private static int smaliCmpGtFloat(float a, float b) throws Exception { 139 Class<?> c = Class.forName("TestCmp"); 140 Method m = c.getMethod("$opt$CmpGtFloat", float.class, float.class); 141 int result = (Integer)m.invoke(null, a, b); 142 return result; 143 } 144 145 private static int smaliCmpLtFloat(float a, float b) throws Exception { 146 Class<?> c = Class.forName("TestCmp"); 147 Method m = c.getMethod("$opt$CmpLtFloat", float.class, float.class); 148 int result = (Integer)m.invoke(null, a, b); 149 return result; 150 } 151 152 private static int smaliCmpGtDouble(double a, double b) throws Exception { 153 Class<?> c = Class.forName("TestCmp"); 154 Method m = c.getMethod("$opt$CmpGtDouble", double.class, double.class); 155 int result = (Integer)m.invoke(null, a, b); 156 return result; 157 } 158 159 private static int smaliCmpLtDouble(double a, double b) throws Exception { 160 Class<?> c = Class.forName("TestCmp"); 161 Method m = c.getMethod("$opt$CmpLtDouble", double.class, double.class); 162 int result = (Integer)m.invoke(null, a, b); 163 return result; 164 } 165 166 public static void expectEquals(int expected, int result) { 167 if (expected != result) { 168 throw new Error("Expected: " + expected + ", found: " + result); 169 } 170 } 171 172 public static void expectLt(long a, long b) { 173 if (!$opt$lt(a, b)) { 174 throw new Error("Expected: " + a + " < " + b); 175 } 176 } 177 178 public static void expectGt(long a, long b) { 179 if (!$opt$gt(a, b)) { 180 throw new Error("Expected: " + a + " > " + b); 181 } 182 } 183 184 public static void expectLt(float a, float b) { 185 if (!$opt$lt(a, b)) { 186 throw new Error("Expected: " + a + " < " + b); 187 } 188 } 189 190 public static void expectGt(float a, float b) { 191 if (!$opt$gt(a, b)) { 192 throw new Error("Expected: " + a + " > " + b); 193 } 194 } 195 196 public static void expectFalse(float a, float b) { 197 if ($opt$lt(a, b)) { 198 throw new Error("Not expecting: " + a + " < " + b); 199 } 200 if ($opt$gt(a, b)) { 201 throw new Error("Not expecting: " + a + " > " + b); 202 } 203 } 204 205 public static void expectLt(double a, double b) { 206 if (!$opt$lt(a, b)) { 207 throw new Error("Expected: " + a + " < " + b); 208 } 209 } 210 211 public static void expectGt(double a, double b) { 212 if (!$opt$gt(a, b)) { 213 throw new Error("Expected: " + a + " > " + b); 214 } 215 } 216 217 public static void expectFalse(double a, double b) { 218 if ($opt$lt(a, b)) { 219 throw new Error("Not expecting: " + a + " < " + b); 220 } 221 if ($opt$gt(a, b)) { 222 throw new Error("Not expecting: " + a + " > " + b); 223 } 224 } 225 226 } 227 228