Paul Duffin | 7fc0b45 | 2015-11-10 17:45:15 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2010 Google Inc. |
| 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 com.google.caliper; |
| 18 | |
| 19 | import com.google.common.collect.ImmutableMap; |
| 20 | import com.google.common.collect.Ordering; |
| 21 | import java.util.Arrays; |
| 22 | import java.util.Collections; |
| 23 | import java.util.List; |
| 24 | import junit.framework.TestCase; |
| 25 | |
| 26 | public class MeasurementSetTest extends TestCase { |
| 27 | |
| 28 | Ordering<Measurement> MEASUREMENT_BY_NANOS = new Ordering<Measurement>() { |
| 29 | @Override public int compare(Measurement a, Measurement b) { |
| 30 | return Double.compare(a.getRaw(), b.getRaw()); |
| 31 | } |
| 32 | }; |
| 33 | |
| 34 | public void testIncompatibleMeasurements() { |
| 35 | Measurement[] measurements = new Measurement[2]; |
| 36 | measurements[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 37 | measurements[1] = new Measurement(ImmutableMap.of("triplens", 1), 3.8, 7.6); |
| 38 | try { |
| 39 | new MeasurementSet(measurements); |
| 40 | fail("illegal argument exception not thrown"); |
| 41 | } catch (IllegalArgumentException e) { |
| 42 | // success |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | public void testIncompatibleAddedMeasurements() { |
| 47 | Measurement[] measurements = new Measurement[1]; |
| 48 | measurements[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 49 | MeasurementSet measurementSet = new MeasurementSet(measurements); |
| 50 | try { |
| 51 | measurementSet.plusMeasurement(new Measurement(ImmutableMap.of("triplens", 1), 3.8, 7.6)); |
| 52 | fail("illegal argument exception not thrown"); |
| 53 | } catch (IllegalArgumentException e) { |
| 54 | // success |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | public void testSize() { |
| 59 | Measurement[] measurements = new Measurement[3]; |
| 60 | measurements[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 61 | measurements[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 62 | measurements[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 63 | MeasurementSet measurementSet = new MeasurementSet(measurements); |
| 64 | assertEquals(3, measurementSet.size()); |
| 65 | |
| 66 | Measurement[] measurements2 = new Measurement[4]; |
| 67 | measurements2[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 68 | measurements2[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 69 | measurements2[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 70 | measurements2[3] = new Measurement(ImmutableMap.of("doublens", 1), 7.2, 14.4); |
| 71 | MeasurementSet measurementSet2 = |
| 72 | new MeasurementSet(measurements2); |
| 73 | assertEquals(4, measurementSet2.size()); |
| 74 | } |
| 75 | |
| 76 | public void testPlusMeasurement() { |
| 77 | Measurement[] measurements = new Measurement[3]; |
| 78 | measurements[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 79 | measurements[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 80 | measurements[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 81 | MeasurementSet measurementSet = new MeasurementSet(measurements); |
| 82 | |
| 83 | Measurement[] measurements2 = new Measurement[4]; |
| 84 | measurements2[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 85 | measurements2[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 86 | measurements2[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 87 | measurements2[3] = new Measurement(ImmutableMap.of("doublens", 1), 7.2, 14.4); |
| 88 | MeasurementSet measurementSet2 = |
| 89 | new MeasurementSet(measurements2); |
| 90 | |
| 91 | MeasurementSet measurementSet3 = measurementSet.plusMeasurement(measurements2[3]); |
| 92 | |
| 93 | assertDoubleListsEquals(measurementSet2.getMeasurementsRaw(), |
| 94 | measurementSet3.getMeasurementsRaw(), 0.0000001); |
| 95 | assertDoubleListsEquals(measurementSet2.getMeasurementUnits(), |
| 96 | measurementSet3.getMeasurementUnits(), 0.0000001); |
| 97 | assertEquals(measurementSet2.getUnitNames(), measurementSet3.getUnitNames()); |
| 98 | |
| 99 | List<Measurement> measurementList1 = |
| 100 | MEASUREMENT_BY_NANOS.sortedCopy(measurementSet2.getMeasurements()); |
| 101 | List<Measurement> measurementList2 = |
| 102 | MEASUREMENT_BY_NANOS.sortedCopy(measurementSet3.getMeasurements()); |
| 103 | assertEquals(measurementList1.size(), measurementList2.size()); |
| 104 | for (int i = 0; i < measurementList1.size(); i++) { |
| 105 | assertEquals(measurementList1.get(i).getRaw(), |
| 106 | measurementList2.get(i).getRaw()); |
| 107 | assertEquals(measurementList1.get(i).getProcessed(), |
| 108 | measurementList2.get(i).getProcessed()); |
| 109 | } |
| 110 | } |
| 111 | |
| 112 | public void testMedian() { |
| 113 | Measurement[] measurements = new Measurement[3]; |
| 114 | measurements[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 115 | measurements[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 116 | measurements[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 117 | MeasurementSet measurementSet = new MeasurementSet(measurements); |
| 118 | assertEquals(2.3, measurementSet.medianRaw(), 0.00000001); |
| 119 | assertEquals(4.6, measurementSet.medianUnits(), 0.00000001); |
| 120 | |
| 121 | Measurement[] measurements2 = new Measurement[4]; |
| 122 | measurements2[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 123 | measurements2[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 124 | measurements2[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 125 | measurements2[3] = new Measurement(ImmutableMap.of("doublens", 1), 7.2, 14.4); |
| 126 | MeasurementSet measurementSet2 = |
| 127 | new MeasurementSet(measurements2); |
| 128 | assertEquals((2.3 + 3.8) / 2, measurementSet2.medianRaw(), 0.00000001); |
| 129 | assertEquals((4.6 + 7.6) / 2, measurementSet2.medianUnits(), 0.00000001); |
| 130 | } |
| 131 | |
| 132 | public void testMean() { |
| 133 | Measurement[] measurements = new Measurement[3]; |
| 134 | measurements[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 135 | measurements[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 136 | measurements[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 137 | MeasurementSet measurementSet = new MeasurementSet(measurements); |
| 138 | assertEquals((1.1 + 3.8 + 2.3) / 3, measurementSet.meanRaw(), 0.00000001); |
| 139 | assertEquals((2.2 + 7.6 + 4.6) / 3, measurementSet.meanUnits(), 0.00000001); |
| 140 | |
| 141 | Measurement[] measurements2 = new Measurement[4]; |
| 142 | measurements2[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 143 | measurements2[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 144 | measurements2[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 145 | measurements2[3] = new Measurement(ImmutableMap.of("doublens", 1), 7.2, 14.4); |
| 146 | MeasurementSet measurementSet2 = |
| 147 | new MeasurementSet(measurements2); |
| 148 | assertEquals((1.1 + 2.3 + 3.8 + 7.2) / 4, measurementSet2.meanRaw(), 0.00000001); |
| 149 | assertEquals((2.2 + 4.6 + 7.6 + 14.4) / 4, measurementSet2.meanUnits(), 0.00000001); |
| 150 | } |
| 151 | |
| 152 | public void testStandardDeviation() { |
| 153 | Measurement[] measurements = new Measurement[3]; |
| 154 | measurements[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 155 | measurements[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 156 | measurements[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 157 | MeasurementSet measurementSet = new MeasurementSet(measurements); |
| 158 | assertEquals(1.35277, measurementSet.standardDeviationRaw(), 0.00001); |
| 159 | assertEquals(2.70555, measurementSet.standardDeviationUnits(), 0.00001); |
| 160 | } |
| 161 | |
| 162 | public void testMax() { |
| 163 | Measurement[] measurements = new Measurement[3]; |
| 164 | measurements[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 165 | measurements[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 166 | measurements[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 167 | MeasurementSet measurementSet = new MeasurementSet(measurements); |
| 168 | assertEquals(3.8, measurementSet.maxRaw(), 0.00000001); |
| 169 | assertEquals(7.6, measurementSet.maxUnits(), 0.00000001); |
| 170 | } |
| 171 | |
| 172 | public void testMin() { |
| 173 | Measurement[] measurements = new Measurement[3]; |
| 174 | measurements[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 175 | measurements[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 176 | measurements[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 177 | MeasurementSet measurementSet = new MeasurementSet(measurements); |
| 178 | assertEquals(1.1, measurementSet.minRaw(), 0.00000001); |
| 179 | assertEquals(2.2, measurementSet.minUnits(), 0.00000001); |
| 180 | } |
| 181 | |
| 182 | public void testJsonRoundtrip() { |
| 183 | Measurement[] measurements = new Measurement[3]; |
| 184 | measurements[0] = new Measurement(ImmutableMap.of("doublens", 1), 1.1, 2.2); |
| 185 | measurements[1] = new Measurement(ImmutableMap.of("doublens", 1), 3.8, 7.6); |
| 186 | measurements[2] = new Measurement(ImmutableMap.of("doublens", 1), 2.3, 4.6); |
| 187 | MeasurementSet measurementSet = new MeasurementSet(measurements); |
| 188 | MeasurementSet roundTripped = |
| 189 | Json.measurementSetFromJson(Json.measurementSetToJson(measurementSet)); |
| 190 | assertDoubleListsEquals(measurementSet.getMeasurementsRaw(), |
| 191 | roundTripped.getMeasurementsRaw(), 0.00000001); |
| 192 | assertDoubleListsEquals(measurementSet.getMeasurementUnits(), |
| 193 | roundTripped.getMeasurementUnits(), 0.00000001); |
| 194 | assertEquals(measurementSet.getUnitNames(), roundTripped.getUnitNames()); |
| 195 | } |
| 196 | |
| 197 | @SuppressWarnings({"AssertEqualsBetweenInconvertibleTypes"}) |
| 198 | public void testFromLegacyString() { |
| 199 | MeasurementSet measurementSet = Json.measurementSetFromJson("122.0 133.0 144.0"); |
| 200 | assertDoubleListsEquals(Arrays.asList(122.0, 133.0, 144.0), |
| 201 | measurementSet.getMeasurementsRaw(), 0.00000001); |
| 202 | assertDoubleListsEquals(Arrays.asList(122.0, 133.0, 144.0), |
| 203 | measurementSet.getMeasurementUnits(), 0.00000001); |
| 204 | assertEquals(ImmutableMap.of("ns", 1, "us", 1000, "ms", 1000000, "s", 1000000000), |
| 205 | measurementSet.getUnitNames()); |
| 206 | } |
| 207 | |
| 208 | private void assertDoubleListsEquals(List<Double> expected, List<Double> actual, double epsilon) { |
| 209 | assertEquals(expected.size(), actual.size()); |
| 210 | Collections.sort(expected); |
| 211 | Collections.sort(actual); |
| 212 | for (int i = 0; i < expected.size(); i++) { |
| 213 | assertEquals(expected.get(i), actual.get(i), epsilon); |
| 214 | } |
| 215 | } |
| 216 | } |