Get preferred units by quantity
authorBill Kuker <bkuker@billkuker.com>
Sun, 31 Oct 2010 19:09:43 +0000 (19:09 +0000)
committerBill Kuker <bkuker@billkuker.com>
Sun, 31 Oct 2010 19:09:43 +0000 (19:09 +0000)
src/com/billkuker/rocketry/motorsim/RocketScience.java
test/UnitTests.java
test/com/billkuker/rocketry/motorsim/test/RocketScienceTest.java [new file with mode: 0644]

index 198bf903ec757517ffe60187bd6e3bc5013a63ee..ab77759613fb345e55a57898a028dbb7f0492b49 100644 (file)
@@ -1,5 +1,7 @@
 package com.billkuker.rocketry.motorsim;\r
 \r
+import java.lang.reflect.Field;\r
+import java.lang.reflect.Modifier;\r
 import java.text.DecimalFormat;\r
 import java.text.NumberFormat;\r
 import java.util.HashSet;\r
@@ -87,6 +89,36 @@ public class RocketScience {
                        }\r
                        return u;\r
                }\r
+               \r
+               @SuppressWarnings("unchecked")\r
+               public <T extends Quantity> Unit<T> getPreferredUnit(Class<T> q){\r
+                       for( Unit<?> u : units ){\r
+                               try {\r
+                                       return u.asType(q); \r
+                               } catch ( ClassCastException e ) {\r
+                                       //Not compatible\r
+                               }\r
+                       }\r
+                       try {\r
+                               Field f = q.getDeclaredField("UNIT");\r
+                               if ( Modifier.isStatic(f.getModifiers()) ){\r
+                                       if ( Unit.class.isAssignableFrom(f.getType())){\r
+                                               return (Unit<T>)f.get(null);\r
+                                       }\r
+                               }\r
+                       } catch (SecurityException e) {\r
+                               e.printStackTrace();\r
+                       } catch (NoSuchFieldException e) {\r
+                               e.printStackTrace();\r
+                       } catch (IllegalArgumentException e) {\r
+                               // TODO Auto-generated catch block\r
+                               e.printStackTrace();\r
+                       } catch (IllegalAccessException e) {\r
+                               // TODO Auto-generated catch block\r
+                               e.printStackTrace();\r
+                       }\r
+                       return null;\r
+               }\r
        }\r
 \r
        public static <T extends Quantity> String ammountToString(Amount<T> a) {\r
index a3365f1bc56504000c31d5d0c191ed5efa0f4f71..bf2a8338cb3671035a8c0ce775eb4e89c60688bf 100644 (file)
@@ -7,12 +7,13 @@ import com.billkuker.rocketry.motorsim.test.CoredCylindricalGrainTest;
 import com.billkuker.rocketry.motorsim.test.CylindricalChamberTest;\r
 import com.billkuker.rocketry.motorsim.test.KNSUTest;\r
 import com.billkuker.rocketry.motorsim.test.MotorIOTest;\r
+import com.billkuker.rocketry.motorsim.test.RocketScienceTest;\r
 import com.billkuker.rocketry.motorsim.test.ShapeUtilTest;\r
 \r
 @RunWith(Suite.class)\r
 @SuiteClasses({ ConvergentDivergentNozzleTest.class,\r
                CoredCylindricalGrainTest.class, CylindricalChamberTest.class,\r
-               KNSUTest.class, MotorIOTest.class, ShapeUtilTest.class })\r
+               KNSUTest.class, MotorIOTest.class, ShapeUtilTest.class, RocketScienceTest.class })\r
 public class UnitTests {\r
 \r
 }\r
diff --git a/test/com/billkuker/rocketry/motorsim/test/RocketScienceTest.java b/test/com/billkuker/rocketry/motorsim/test/RocketScienceTest.java
new file mode 100644 (file)
index 0000000..eed0804
--- /dev/null
@@ -0,0 +1,43 @@
+package com.billkuker.rocketry.motorsim.test;\r
+\r
+import javax.measure.quantity.Duration;\r
+import javax.measure.quantity.Length;\r
+import javax.measure.quantity.RadioactiveActivity;\r
+import javax.measure.unit.NonSI;\r
+import javax.measure.unit.SI;\r
+import javax.measure.unit.Unit;\r
+\r
+import junit.framework.Assert;\r
+\r
+import org.junit.Test;\r
+\r
+import com.billkuker.rocketry.motorsim.RocketScience;\r
+\r
+public class RocketScienceTest {\r
+\r
+       @Test\r
+       public void getPreferredUnitByQuantity() throws Exception {\r
+               Unit<Length> l = RocketScience.UnitPreference.SI.getPreferredUnit(Length.class);\r
+               Assert.assertTrue(l.isCompatible(SI.MILLIMETER));\r
+               \r
+               Unit<Duration> t = RocketScience.UnitPreference.SI.getPreferredUnit(Duration.class);\r
+               Assert.assertTrue(t.isCompatible(SI.SECOND));\r
+               \r
+               //Just make sure it'll return for any quantity\r
+               Unit<RadioactiveActivity> r = RocketScience.UnitPreference.SI.getPreferredUnit(RadioactiveActivity.class);\r
+               Assert.assertTrue(r.isCompatible(NonSI.RUTHERFORD));\r
+       }\r
+       \r
+       @Test\r
+       public void getPreferredUnitByUnit() throws Exception {\r
+               Unit<Length> l = RocketScience.UnitPreference.SI.getPreferredUnit(NonSI.INCH);\r
+               Assert.assertTrue(l.isCompatible(SI.MILLIMETER));\r
+               \r
+               Unit<Duration> t = RocketScience.UnitPreference.SI.getPreferredUnit(NonSI.DAY);\r
+               Assert.assertTrue(t.isCompatible(SI.SECOND));\r
+               \r
+               //Just make sure it'll return for any quantity\r
+               Unit<RadioactiveActivity> r = RocketScience.UnitPreference.SI.getPreferredUnit(NonSI.RUTHERFORD);\r
+               Assert.assertTrue(r.isCompatible(NonSI.RUTHERFORD));\r
+       }\r
+}\r