package org.altbeacon.beacon.distance; import android.content.Context; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import static org.junit.Assert.assertEquals; @Config(sdk = 18) @RunWith(RobolectricTestRunner.class) /* HOW TO SEE DEBUG LINES FROM YOUR UNIT TESTS: 1. set a line like this at the start of your test: org.robolectric.shadows.ShadowLog.stream = System.err; 2. run the tests from the command line 3. Look at the test report file in your web browser, e.g. file:///Users/dyoung/workspace/AndroidProximityLibrary/build/reports/tests/index.html 4. Expand the System.err section /** * Created by dyoung on 8/28/14. */ public class ModelSpecificDistanceCalculatorTest { @Test public void testCalculatesDistance() { org.robolectric.shadows.ShadowLog.stream = System.err; ModelSpecificDistanceCalculator distanceCalculator = new ModelSpecificDistanceCalculator(null, null); Double distance = distanceCalculator.calculateDistance(-59, -59); assertEquals("Distance should be 1.0 for same power and rssi", 1.0, distance, 0.1); } @Test public void testSelectsDefaultModel() { org.robolectric.shadows.ShadowLog.stream = System.err; ModelSpecificDistanceCalculator distanceCalculator = new ModelSpecificDistanceCalculator(null, null); assertEquals("Default model should be Nexus 5", "Nexus 5", distanceCalculator.getModel().getModel()); } @Test public void testSelectsNexus4OnExactMatch() { org.robolectric.shadows.ShadowLog.stream = System.err; AndroidModel model = new AndroidModel("4.4.2", "KOT49H","Nexus 4","LGE"); ModelSpecificDistanceCalculator distanceCalculator = new ModelSpecificDistanceCalculator(null, null, model); assertEquals("should be Nexus 4", "Nexus 4", distanceCalculator.getModel().getModel()); } @Test public void testCalculatesDistanceForMotoXPro() { final Context applicationContext = ShadowApplication.getInstance().getApplicationContext(); org.robolectric.shadows.ShadowLog.stream = System.err; final AndroidModel model = new AndroidModel("5.0.2", "LXG22.67-7.1", "Moto X Pro", "XT1115"); ModelSpecificDistanceCalculator distanceCalculator = new ModelSpecificDistanceCalculator(applicationContext, null, model); assertEquals("should be Moto X Pro", "Moto X Pro", distanceCalculator.getModel().getModel()); Double distance = distanceCalculator.calculateDistance(-49, -58); assertEquals("Distance should be as predicted by coefficients at 3 meters", 2.661125466, distance, 0.1); } @Test public void testConcurrentModificationException() { org.robolectric.shadows.ShadowLog.stream = System.err; final Context applicationContext = ShadowApplication.getInstance().getApplicationContext(); final AndroidModel model = new AndroidModel("4.4.2", "KOT49H", "Nexus 4", "LGE"); final String modelMapJson = "{\"models\":[ \"coefficient1\": 0.89976,\"coefficient2\": 7.7095,\"coefficient3\": 0.111," + "\"version\":\"4.4.2\",\"build_number\":\"KOT49H\",\"model\":\"Nexus 4\"," + "\"manufacturer\":\"LGE\"},{\"coefficient1\": 0.42093,\"coefficient2\": 6.9476," + "\"coefficient3\": 0.54992,\"version\":\"4.4.2\",\"build_number\":\"LPV79\"," + "\"model\":\"Nexus 5\",\"manufacturer\":\"LGE\",\"default\": true}]}"; final ModelSpecificDistanceCalculator distanceCalculator = new ModelSpecificDistanceCalculator(applicationContext, null, model); Runnable runnable2 = new Runnable() { @Override public void run() { try { while (true) { distanceCalculator.buildModelMapWithLock(modelMapJson); } } catch (Exception ex) { ex.printStackTrace(); } } }; Thread thread2 = new Thread(runnable2); thread2.start(); int i = 0; while (++i < 1000 && thread2.getState() != Thread.State.TERMINATED) { distanceCalculator.findCalculatorForModelWithLock(model); } thread2.interrupt(); } }