blob: 3c7b13fc6446e2c622c91d39960db0f24a73a81f [file] [log] [blame]
Calin Juravleddb7df22014-11-25 20:56:51 +00001/*
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
17import java.lang.reflect.Method;
18
19public 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