From: kruland2607 Date: Sun, 22 Apr 2012 20:26:22 +0000 (+0000) Subject: Change nose cone preset to use Aft Outer Diameter, Aft Shoulder Length, and Aft Shoul... X-Git-Tag: upstream/12.09^2~337 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=d6033007b43b6969696d419f0c8d5b279136f430;p=debian%2Fopenrocket Change nose cone preset to use Aft Outer Diameter, Aft Shoulder Length, and Aft Shoulder Diameter to be consistent with Transitions. Added a bunch of unit tests and correct behavior of the rocketcomponent setters to clear the preset appropriately. Modified the temporary csv data files to use the "aft" specifiers. git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@585 180e2498-e6e9-4542-8430-84ac67f01cd8 --- diff --git a/core/resources/datafiles/presets/semroc/ncpresets.csv b/core/resources/datafiles/presets/semroc/ncpresets.csv index 68fea022..ace8f513 100644 --- a/core/resources/datafiles/presets/semroc/ncpresets.csv +++ b/core/resources/datafiles/presets/semroc/ncpresets.csv @@ -1,4 +1,4 @@ -Manufacturer,PartNo,Description,Type,Length,OuterDiameter,ShoulderLength,ShoulderDiameter,Filled,Shape,Material,Mass +Manufacturer,PartNo,Description,Type,Length,AftOuterDiameter,AftShoulderLength,AftShoulderDiameter,Filled,Shape,Material,Mass Semroc,BC-08542,Ogive,NOSE_CONE,0.10668,0.023876,0.0127,0.02159,1,ogive,Balsa,0.004252428 Semroc,BC-1016,Ogive,NOSE_CONE,0.04064,0.026416,0.0127,0.0254,1,ogive,Balsa,0.003401943 Semroc,BC-1019,Ogive,NOSE_CONE,0.04826,0.026416,0.0127,0.0254,1,ogive,Balsa,0.003685438 diff --git a/core/resources/datafiles/presets/semroc/transitionpresets.csv b/core/resources/datafiles/presets/semroc/transitionpresets.csv index 91d57109..491dd103 100644 --- a/core/resources/datafiles/presets/semroc/transitionpresets.csv +++ b/core/resources/datafiles/presets/semroc/transitionpresets.csv @@ -1,157 +1,157 @@ -Manufacturer,PartNo,Description,Type,ForeShoulderLength,ForeShoulderDiameter,ForeOuterDiameter,Length,OuterDiameter,ShoulderLength,ShoulderDiameter,Filled,Material,Mass,Shape +Manufacturer,PartNo,Description,Type,ForeShoulderLength,ForeShoulderDiameter,ForeOuterDiameter,Length,AftOuterDiameter,AftShoulderLength,AftShoulderDiameter,Filled,Material,Mass,Shape Semroc,BR-085225,Balsa Reducer 085 to 225,TRANSITION,0.0127,0.021971,0.024003,0.0635,0.059436,0.0127,0.05715,1,Balsa,0.022113,cone -Semroc,BR-085225 [R],Balsa Reducer 085 to 225 – Reversed,TRANSITION,0.0127,0.05715,0.059436,0.0635,0.024003,0.0127,0.021971,1,Balsa,0.022113,cone +Semroc,BR-085225 [R],Balsa Reducer 085 to 225 � Reversed,TRANSITION,0.0127,0.05715,0.059436,0.0635,0.024003,0.0127,0.021971,1,Balsa,0.022113,cone Semroc,BR-1013,Balsa Reducer 10 to 13,TRANSITION,0.0127,0.0254,0.026416,0.01905,0.034036,0.0127,0.03302,1,Balsa,0.005103,cone -Semroc,BR-1013 [R],Balsa Reducer 10 to 13 – Reversed,TRANSITION,0.0127,0.03302,0.034036,0.01905,0.026416,0.0127,0.0254,1,Balsa,0.005103,cone +Semroc,BR-1013 [R],Balsa Reducer 10 to 13 � Reversed,TRANSITION,0.0127,0.03302,0.034036,0.01905,0.026416,0.0127,0.0254,1,Balsa,0.005103,cone Semroc,BR-1016,Balsa Reducer 10 to 16,TRANSITION,0.0127,0.0254,0.026416,0.0381,0.041656,0.0127,0.04064,1,Balsa,0.009072,cone -Semroc,BR-1016 [R],Balsa Reducer 10 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0381,0.026416,0.0127,0.0254,1,Balsa,0.009072,cone +Semroc,BR-1016 [R],Balsa Reducer 10 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0381,0.026416,0.0127,0.0254,1,Balsa,0.009072,cone Semroc,BR-1016S,Balsa Reducer 10 to 16,TRANSITION,0.0127,0.0254,0.026416,0.03048,0.041656,0.0127,0.04064,1,Balsa,0.0082215,cone -Semroc,BR-1016S [R],Balsa Reducer 10 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.03048,0.026416,0.0127,0.0254,1,Balsa,0.0082215,cone +Semroc,BR-1016S [R],Balsa Reducer 10 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.03048,0.026416,0.0127,0.0254,1,Balsa,0.0082215,cone Semroc,BR-1116,Balsa Reducer 11 to 16,TRANSITION,0.0127,0.028702,0.029718,0.0381,0.041656,0.0127,0.04064,1,Balsa,0.0093555,cone -Semroc,BR-1116 [R],Balsa Reducer 11 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0381,0.029718,0.0127,0.028702,1,Balsa,0.0093555,cone +Semroc,BR-1116 [R],Balsa Reducer 11 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0381,0.029718,0.0127,0.028702,1,Balsa,0.0093555,cone Semroc,BR-1118,Balsa Reducer 11 to 18,TRANSITION,0.0127,0.028702,0.029718,0.0381,0.046736,0.0127,0.04572,1,Balsa,0.010206,cone -Semroc,BR-1118 [R],Balsa Reducer 11 to 18 – Reversed,TRANSITION,0.0127,0.04572,0.046736,0.0381,0.029718,0.0127,0.028702,1,Balsa,0.010206,cone +Semroc,BR-1118 [R],Balsa Reducer 11 to 18 � Reversed,TRANSITION,0.0127,0.04572,0.046736,0.0381,0.029718,0.0127,0.028702,1,Balsa,0.010206,cone Semroc,BR-11516,Balsa Reducer 115 to 16,TRANSITION,0.0127,0.028956,0.030988,0.085725,0.041656,0.0127,0.04064,1,Balsa,0.0297675,cone -Semroc,BR-11516 [R],Balsa Reducer 115 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.085725,0.030988,0.0127,0.028956,1,Balsa,0.0297675,cone +Semroc,BR-11516 [R],Balsa Reducer 115 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.085725,0.030988,0.0127,0.028956,1,Balsa,0.0297675,cone Semroc,BR-11518,Balsa Reducer 115 to 18,TRANSITION,0.0127,0.028956,0.030988,0.085725,0.046736,0.0127,0.04572,1,Balsa,0.031185,cone -Semroc,BR-11518 [R],Balsa Reducer 115 to 18 – Reversed,TRANSITION,0.0127,0.04572,0.046736,0.085725,0.030988,0.0127,0.028956,1,Balsa,0.031185,cone +Semroc,BR-11518 [R],Balsa Reducer 115 to 18 � Reversed,TRANSITION,0.0127,0.04572,0.046736,0.085725,0.030988,0.0127,0.028956,1,Balsa,0.031185,cone Semroc,BR-125-175,Balsa Reducer 125 to 175,TRANSITION,0.0127,0.03175,0.034036,0.05334,0.046736,0.0127,0.04445,1,Balsa,0.014175,cone -Semroc,BR-125-175 [R],Balsa Reducer 125 to 175 – Reversed,TRANSITION,0.0127,0.04445,0.046736,0.05334,0.034036,0.0127,0.03175,1,Balsa,0.014175,cone +Semroc,BR-125-175 [R],Balsa Reducer 125 to 175 � Reversed,TRANSITION,0.0127,0.04445,0.046736,0.05334,0.034036,0.0127,0.03175,1,Balsa,0.014175,cone Semroc,BR-125-175L,Balsa Reducer 125 to 175,TRANSITION,0.0127,0.03175,0.034036,0.07112,0.046736,0.0127,0.04445,1,Balsa,0.0184275,cone -Semroc,BR-125-175L [R],Balsa Reducer 125 to 175 – Reversed,TRANSITION,0.0127,0.04445,0.046736,0.07112,0.034036,0.0127,0.03175,1,Balsa,0.0184275,cone +Semroc,BR-125-175L [R],Balsa Reducer 125 to 175 � Reversed,TRANSITION,0.0127,0.04445,0.046736,0.07112,0.034036,0.0127,0.03175,1,Balsa,0.0184275,cone Semroc,BR-125-225,Balsa Reducer 125 to 225,TRANSITION,0.0127,0.03175,0.034036,0.07112,0.059436,0.0127,0.05715,1,Balsa,0.01701,cone -Semroc,BR-125-225 [R],Balsa Reducer 125 to 225 – Reversed,TRANSITION,0.0127,0.05715,0.059436,0.07112,0.034036,0.0127,0.03175,1,Balsa,0.01701,cone +Semroc,BR-125-225 [R],Balsa Reducer 125 to 225 � Reversed,TRANSITION,0.0127,0.05715,0.059436,0.07112,0.034036,0.0127,0.03175,1,Balsa,0.01701,cone Semroc,BR-1316,Balsa Reducer 13 to 16,TRANSITION,0.0127,0.03302,0.034036,0.01905,0.041656,0.0127,0.04064,1,Balsa,0.006804,cone -Semroc,BR-1316 [R],Balsa Reducer 13 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.01905,0.034036,0.0127,0.03302,1,Balsa,0.006804,cone +Semroc,BR-1316 [R],Balsa Reducer 13 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.01905,0.034036,0.0127,0.03302,1,Balsa,0.006804,cone Semroc,BR-1316F,Balsa Reducer 13 to 16,TRANSITION,0.0127,0.03302,0.034036,0.04445,0.041656,0.0127,0.04064,1,Balsa,0.010206,cone -Semroc,BR-1316F [R],Balsa Reducer 13 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.04445,0.034036,0.0127,0.03302,1,Balsa,0.010206,cone +Semroc,BR-1316F [R],Balsa Reducer 13 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.04445,0.034036,0.0127,0.03302,1,Balsa,0.010206,cone Semroc,BR-1316L,Balsa Reducer 13 to 16,TRANSITION,0.0127,0.03302,0.034036,0.0381,0.041656,0.0127,0.04064,1,Balsa,0.008505,cone -Semroc,BR-1316L [R],Balsa Reducer 13 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0381,0.034036,0.0127,0.03302,1,Balsa,0.008505,cone +Semroc,BR-1316L [R],Balsa Reducer 13 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0381,0.034036,0.0127,0.03302,1,Balsa,0.008505,cone Semroc,BR-1316M,Balsa Reducer 13 to 16,TRANSITION,0.0127,0.03302,0.034036,0.0254,0.041656,0.0127,0.04064,1,Balsa,0.007938,cone -Semroc,BR-1316M [R],Balsa Reducer 13 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0254,0.034036,0.0127,0.03302,1,Balsa,0.007938,cone +Semroc,BR-1316M [R],Balsa Reducer 13 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0254,0.034036,0.0127,0.03302,1,Balsa,0.007938,cone Semroc,BR-1320,Balsa Reducer 13 to 20,TRANSITION,0.0127,0.03302,0.034036,0.01905,0.051816,0.0127,0.0508,1,Balsa,0.007938,cone -Semroc,BR-1320 [R],Balsa Reducer 13 to 20 – Reversed,TRANSITION,0.0127,0.0508,0.051816,0.01905,0.034036,0.0127,0.03302,1,Balsa,0.007938,cone +Semroc,BR-1320 [R],Balsa Reducer 13 to 20 � Reversed,TRANSITION,0.0127,0.0508,0.051816,0.01905,0.034036,0.0127,0.03302,1,Balsa,0.007938,cone Semroc,BR-1320L,Balsa Reducer 13 to 20,TRANSITION,0.0127,0.03302,0.034036,0.1143,0.051816,0.0127,0.0508,1,Balsa,0.015876,cone -Semroc,BR-1320L [R],Balsa Reducer 13 to 20 – Reversed,TRANSITION,0.0127,0.0508,0.051816,0.1143,0.034036,0.0127,0.03302,1,Balsa,0.015876,cone +Semroc,BR-1320L [R],Balsa Reducer 13 to 20 � Reversed,TRANSITION,0.0127,0.0508,0.051816,0.1143,0.034036,0.0127,0.03302,1,Balsa,0.015876,cone Semroc,BR-150-225,Balsa Reducer 150 to 225,TRANSITION,0.0127,0.0381,0.040386,0.05715,0.059436,0.0127,0.05715,1,Balsa,0.0297675,cone -Semroc,BR-150-225 [R],Balsa Reducer 150 to 225 – Reversed,TRANSITION,0.0127,0.05715,0.059436,0.05715,0.040386,0.0127,0.0381,1,Balsa,0.0297675,cone +Semroc,BR-150-225 [R],Balsa Reducer 150 to 225 � Reversed,TRANSITION,0.0127,0.05715,0.059436,0.05715,0.040386,0.0127,0.0381,1,Balsa,0.0297675,cone Semroc,BR-150-275,Balsa Reducer 150 to 275,TRANSITION,0.0127,0.0381,0.040386,0.07366,0.072136,0.0127,0.06985,1,Balsa,0.0411075,cone -Semroc,BR-150-275 [R],Balsa Reducer 150 to 275 – Reversed,TRANSITION,0.0127,0.06985,0.072136,0.07366,0.040386,0.0127,0.0381,1,Balsa,0.0411075,cone +Semroc,BR-150-275 [R],Balsa Reducer 150 to 275 � Reversed,TRANSITION,0.0127,0.06985,0.072136,0.07366,0.040386,0.0127,0.0381,1,Balsa,0.0411075,cone Semroc,BR-1618,Balsa Reducer 16 to 18,TRANSITION,0.0127,0.04064,0.041656,0.0381,0.046736,0.0127,0.04572,1,Balsa,0.007938,cone -Semroc,BR-1618 [R],Balsa Reducer 16 to 18 – Reversed,TRANSITION,0.0127,0.04572,0.046736,0.0381,0.041656,0.0127,0.04064,1,Balsa,0.007938,cone +Semroc,BR-1618 [R],Balsa Reducer 16 to 18 � Reversed,TRANSITION,0.0127,0.04572,0.046736,0.0381,0.041656,0.0127,0.04064,1,Balsa,0.007938,cone Semroc,BR-1618F,Balsa Reducer 16 to 18,TRANSITION,0.0127,0.04064,0.041656,0.04572,0.046736,0.0127,0.04572,1,Balsa,0.008505,cone -Semroc,BR-1618F [R],Balsa Reducer 16 to 18 – Reversed,TRANSITION,0.0127,0.04572,0.046736,0.04572,0.041656,0.0127,0.04064,1,Balsa,0.008505,cone +Semroc,BR-1618F [R],Balsa Reducer 16 to 18 � Reversed,TRANSITION,0.0127,0.04572,0.046736,0.04572,0.041656,0.0127,0.04064,1,Balsa,0.008505,cone Semroc,BR-1620,Balsa Reducer 16 to 20,TRANSITION,0.0127,0.04064,0.041656,0.0381,0.051816,0.0127,0.0508,1,Balsa,0.008505,cone -Semroc,BR-1620 [R],Balsa Reducer 16 to 20 – Reversed,TRANSITION,0.0127,0.0508,0.051816,0.0381,0.041656,0.0127,0.04064,1,Balsa,0.008505,cone +Semroc,BR-1620 [R],Balsa Reducer 16 to 20 � Reversed,TRANSITION,0.0127,0.0508,0.051816,0.0381,0.041656,0.0127,0.04064,1,Balsa,0.008505,cone Semroc,BR-1620F,Balsa Reducer 16 to 20,TRANSITION,0.0127,0.04064,0.041656,0.03048,0.051816,0.0127,0.0508,1,Balsa,0.0076545,cone -Semroc,BR-1620F [R],Balsa Reducer 16 to 20 – Reversed,TRANSITION,0.0127,0.0508,0.051816,0.03048,0.041656,0.0127,0.04064,1,Balsa,0.0076545,cone +Semroc,BR-1620F [R],Balsa Reducer 16 to 20 � Reversed,TRANSITION,0.0127,0.0508,0.051816,0.03048,0.041656,0.0127,0.04064,1,Balsa,0.0076545,cone Semroc,BR-16225F,Balsa Reducer 16 to 225,TRANSITION,0.0127,0.04064,0.041656,0.03937,0.059436,0.0127,0.05715,1,Balsa,0.0093555,cone -Semroc,BR-16225F [R],Balsa Reducer 16 to 225 – Reversed,TRANSITION,0.0127,0.05715,0.059436,0.03937,0.041656,0.0127,0.04064,1,Balsa,0.0093555,cone +Semroc,BR-16225F [R],Balsa Reducer 16 to 225 � Reversed,TRANSITION,0.0127,0.05715,0.059436,0.03937,0.041656,0.0127,0.04064,1,Balsa,0.0093555,cone Semroc,BR-175-225,Balsa Reducer 175 to 225,TRANSITION,0.0127,0.04445,0.046736,0.05334,0.059436,0.0127,0.05715,1,Balsa,0.02268,cone -Semroc,BR-175-225 [R],Balsa Reducer 175 to 225 – Reversed,TRANSITION,0.0127,0.05715,0.059436,0.05334,0.046736,0.0127,0.04445,1,Balsa,0.02268,cone +Semroc,BR-175-225 [R],Balsa Reducer 175 to 225 � Reversed,TRANSITION,0.0127,0.05715,0.059436,0.05334,0.046736,0.0127,0.04445,1,Balsa,0.02268,cone Semroc,BR-1820,Balsa Reducer 18 to 20,TRANSITION,0.0127,0.04572,0.046736,0.0381,0.051816,0.0127,0.0508,1,Balsa,0.0070875,cone -Semroc,BR-1820 [R],Balsa Reducer 18 to 20 – Reversed,TRANSITION,0.0127,0.0508,0.051816,0.0381,0.046736,0.0127,0.04572,1,Balsa,0.0070875,cone +Semroc,BR-1820 [R],Balsa Reducer 18 to 20 � Reversed,TRANSITION,0.0127,0.0508,0.051816,0.0381,0.046736,0.0127,0.04572,1,Balsa,0.0070875,cone Semroc,BR-18225,Balsa Reducer 18 to 225,TRANSITION,0.0127,0.04572,0.046736,0.0508,0.059436,0.0127,0.05715,1,Balsa,0.0087885,cone -Semroc,BR-18225 [R],Balsa Reducer 18 to 225 – Reversed,TRANSITION,0.0127,0.05715,0.059436,0.0508,0.046736,0.0127,0.04572,1,Balsa,0.0087885,cone +Semroc,BR-18225 [R],Balsa Reducer 18 to 225 � Reversed,TRANSITION,0.0127,0.05715,0.059436,0.0508,0.046736,0.0127,0.04572,1,Balsa,0.0087885,cone Semroc,BR-225-80H,Balsa Reducer 225 to BT-80H,TRANSITION,0.0127,0.05715,0.059436,0.05334,0.067056,0.0127,0.0649732,1,Balsa,0.036855,cone -Semroc,BR-225-80H [R],Balsa Reducer 225 to BT-80H – Reversed,TRANSITION,0.0127,0.0649732,0.067056,0.05334,0.059436,0.0127,0.05715,1,Balsa,0.036855,cone +Semroc,BR-225-80H [R],Balsa Reducer 225 to BT-80H � Reversed,TRANSITION,0.0127,0.0649732,0.067056,0.05334,0.059436,0.0127,0.05715,1,Balsa,0.036855,cone Semroc,BR-510,Balsa Reducer 5 to 10,TRANSITION,0.0127,0.013081,0.0137922,0.01905,0.026416,0.0127,0.0254,1,Balsa,0.0031185,cone -Semroc,BR-510 [R],Balsa Reducer 5 to 10 – Reversed,TRANSITION,0.0127,0.0254,0.026416,0.01905,0.0137922,0.0127,0.013081,1,Balsa,0.0031185,cone +Semroc,BR-510 [R],Balsa Reducer 5 to 10 � Reversed,TRANSITION,0.0127,0.0254,0.026416,0.01905,0.0137922,0.0127,0.013081,1,Balsa,0.0031185,cone Semroc,BR-511,Balsa Reducer 5 to 11,TRANSITION,0.0127,0.013081,0.0137922,0.01905,0.029718,0.0127,0.028702,1,Balsa,0.003402,cone -Semroc,BR-511 [R],Balsa Reducer 5 to 11 – Reversed,TRANSITION,0.0127,0.028702,0.029718,0.01905,0.0137922,0.0127,0.013081,1,Balsa,0.003402,cone +Semroc,BR-511 [R],Balsa Reducer 5 to 11 � Reversed,TRANSITION,0.0127,0.028702,0.029718,0.01905,0.0137922,0.0127,0.013081,1,Balsa,0.003402,cone Semroc,BR-513,Balsa Reducer 5 to 13,TRANSITION,0.0127,0.013081,0.0137922,0.0381,0.034036,0.0127,0.03302,1,Balsa,0.004536,cone -Semroc,BR-513 [R],Balsa Reducer 5 to 13 – Reversed,TRANSITION,0.0127,0.03302,0.034036,0.0381,0.0137922,0.0127,0.013081,1,Balsa,0.004536,cone +Semroc,BR-513 [R],Balsa Reducer 5 to 13 � Reversed,TRANSITION,0.0127,0.03302,0.034036,0.0381,0.0137922,0.0127,0.013081,1,Balsa,0.004536,cone Semroc,BR-57,Balsa Reducer 5 to 7,TRANSITION,0.0127,0.013081,0.0137922,0.0127,0.0192786,0.0127,0.018161,1,Balsa,0.0019845,cone -Semroc,BR-57 [R],Balsa Reducer 5 to 7 – Reversed,TRANSITION,0.0127,0.018161,0.0192786,0.0127,0.0137922,0.0127,0.013081,1,Balsa,0.0019845,cone +Semroc,BR-57 [R],Balsa Reducer 5 to 7 � Reversed,TRANSITION,0.0127,0.018161,0.0192786,0.0127,0.0137922,0.0127,0.013081,1,Balsa,0.0019845,cone Semroc,BR-58,Balsa Reducer 5 to 8,TRANSITION,0.0127,0.013081,0.0137922,0.0127,0.0230632,0.0127,0.021971,1,Balsa,0.002835,cone -Semroc,BR-58 [R],Balsa Reducer 5 to 8 – Reversed,TRANSITION,0.0127,0.021971,0.0230632,0.0127,0.0137922,0.0127,0.013081,1,Balsa,0.002835,cone +Semroc,BR-58 [R],Balsa Reducer 5 to 8 � Reversed,TRANSITION,0.0127,0.021971,0.0230632,0.0127,0.0137922,0.0127,0.013081,1,Balsa,0.002835,cone Semroc,BR-58F,Balsa Reducer 5 to 8F,TRANSITION,0.0127,0.013081,0.0137922,0.0127,0.0233934,0.0127,0.022479,1,Balsa,0.002835,cone -Semroc,BR-58F [R],Balsa Reducer 5 to 8F – Reversed,TRANSITION,0.0127,0.022479,0.0233934,0.0127,0.0137922,0.0127,0.013081,1,Balsa,0.002835,cone +Semroc,BR-58F [R],Balsa Reducer 5 to 8F � Reversed,TRANSITION,0.0127,0.022479,0.0233934,0.0127,0.0137922,0.0127,0.013081,1,Balsa,0.002835,cone Semroc,BR-59,Balsa Reducer 5 to 9,TRANSITION,0.0127,0.013081,0.0137922,0.0254,0.0253492,0.0127,0.02413,1,Balsa,0.005103,cone -Semroc,BR-59 [R],Balsa Reducer 5 to 9 – Reversed,TRANSITION,0.0127,0.02413,0.0253492,0.0254,0.0137922,0.0127,0.013081,1,Balsa,0.005103,cone +Semroc,BR-59 [R],Balsa Reducer 5 to 9 � Reversed,TRANSITION,0.0127,0.02413,0.0253492,0.0254,0.0137922,0.0127,0.013081,1,Balsa,0.005103,cone Semroc,BR-60-18,Balsa Reducer BT-60 to ST-18,TRANSITION,0.0127,0.040513,0.0415798,0.0254,0.046736,0.0127,0.04572,1,Balsa,0.0082215,cone -Semroc,BR-60-18 [R],Balsa Reducer BT-60 to ST-18 – Reversed,TRANSITION,0.0127,0.04572,0.046736,0.0254,0.0415798,0.0127,0.040513,1,Balsa,0.0082215,cone +Semroc,BR-60-18 [R],Balsa Reducer BT-60 to ST-18 � Reversed,TRANSITION,0.0127,0.04572,0.046736,0.0254,0.0415798,0.0127,0.040513,1,Balsa,0.0082215,cone Semroc,BR-710,Balsa Reducer 7 to 10,TRANSITION,0.0127,0.018161,0.0192786,0.01905,0.026416,0.0127,0.0254,1,Balsa,0.003402,cone -Semroc,BR-710 [R],Balsa Reducer 7 to 10 – Reversed,TRANSITION,0.0127,0.0254,0.026416,0.01905,0.0192786,0.0127,0.018161,1,Balsa,0.003402,cone +Semroc,BR-710 [R],Balsa Reducer 7 to 10 � Reversed,TRANSITION,0.0127,0.0254,0.026416,0.01905,0.0192786,0.0127,0.018161,1,Balsa,0.003402,cone Semroc,BR-711,Balsa Reducer 7 to 11,TRANSITION,0.0127,0.018161,0.0192786,0.01905,0.029718,0.0127,0.028702,1,Balsa,0.0036855,cone -Semroc,BR-711 [R],Balsa Reducer 7 to 11 – Reversed,TRANSITION,0.0127,0.028702,0.029718,0.01905,0.0192786,0.0127,0.018161,1,Balsa,0.0036855,cone +Semroc,BR-711 [R],Balsa Reducer 7 to 11 � Reversed,TRANSITION,0.0127,0.028702,0.029718,0.01905,0.0192786,0.0127,0.018161,1,Balsa,0.0036855,cone Semroc,BR-713,Balsa Reducer 7 to 13,TRANSITION,0.0127,0.018161,0.0192786,0.0381,0.034036,0.0127,0.03302,1,Balsa,0.005103,cone -Semroc,BR-713 [R],Balsa Reducer 7 to 13 – Reversed,TRANSITION,0.0127,0.03302,0.034036,0.0381,0.0192786,0.0127,0.018161,1,Balsa,0.005103,cone +Semroc,BR-713 [R],Balsa Reducer 7 to 13 � Reversed,TRANSITION,0.0127,0.03302,0.034036,0.0381,0.0192786,0.0127,0.018161,1,Balsa,0.005103,cone Semroc,BR-716,Balsa Reducer 7 to 16,TRANSITION,0.0127,0.018161,0.0192786,0.0508,0.041656,0.0127,0.04064,1,Balsa,0.010206,cone -Semroc,BR-716 [R],Balsa Reducer 7 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0508,0.0192786,0.0127,0.018161,1,Balsa,0.010206,cone +Semroc,BR-716 [R],Balsa Reducer 7 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0508,0.0192786,0.0127,0.018161,1,Balsa,0.010206,cone Semroc,BR-718,Balsa Reducer 7 to 18,TRANSITION,0.0127,0.018161,0.0192786,0.0508,0.046736,0.0127,0.04572,1,Balsa,0.011907,cone -Semroc,BR-718 [R],Balsa Reducer 7 to 18 – Reversed,TRANSITION,0.0127,0.04572,0.046736,0.0508,0.0192786,0.0127,0.018161,1,Balsa,0.011907,cone +Semroc,BR-718 [R],Balsa Reducer 7 to 18 � Reversed,TRANSITION,0.0127,0.04572,0.046736,0.0508,0.0192786,0.0127,0.018161,1,Balsa,0.011907,cone Semroc,BR-78,Balsa Reducer 7 to 8,TRANSITION,0.0127,0.018161,0.0192786,0.022225,0.0230632,0.0127,0.021971,1,Balsa,0.0036855,cone -Semroc,BR-78 [R],Balsa Reducer 7 to 8 – Reversed,TRANSITION,0.0127,0.021971,0.0230632,0.022225,0.0192786,0.0127,0.018161,1,Balsa,0.0036855,cone +Semroc,BR-78 [R],Balsa Reducer 7 to 8 � Reversed,TRANSITION,0.0127,0.021971,0.0230632,0.022225,0.0192786,0.0127,0.018161,1,Balsa,0.0036855,cone Semroc,BR-78F,Balsa Reducer 7 to 8F,TRANSITION,0.0127,0.018161,0.0192786,0.0254,0.0233934,0.0127,0.022479,1,Balsa,0.0048195,cone -Semroc,BR-78F [R],Balsa Reducer 7 to 8F – Reversed,TRANSITION,0.0127,0.022479,0.0233934,0.0254,0.0192786,0.0127,0.018161,1,Balsa,0.0048195,cone +Semroc,BR-78F [R],Balsa Reducer 7 to 8F � Reversed,TRANSITION,0.0127,0.022479,0.0233934,0.0254,0.0192786,0.0127,0.018161,1,Balsa,0.0048195,cone Semroc,BR-78S,Balsa Reducer 7 to 8,TRANSITION,0.0127,0.018161,0.0192786,0.0127,0.0230632,0.0127,0.021971,1,Balsa,0.002835,cone -Semroc,BR-78S [R],Balsa Reducer 7 to 8 – Reversed,TRANSITION,0.0127,0.021971,0.0230632,0.0127,0.0192786,0.0127,0.018161,1,Balsa,0.002835,cone +Semroc,BR-78S [R],Balsa Reducer 7 to 8 � Reversed,TRANSITION,0.0127,0.021971,0.0230632,0.0127,0.0192786,0.0127,0.018161,1,Balsa,0.002835,cone Semroc,BR-79,Balsa Reducer 7 to 9,TRANSITION,0.0127,0.018161,0.0192786,0.0254,0.0253492,0.0127,0.02413,1,Balsa,0.0048195,cone -Semroc,BR-79 [R],Balsa Reducer 7 to 9 – Reversed,TRANSITION,0.0127,0.02413,0.0253492,0.0254,0.0192786,0.0127,0.018161,1,Balsa,0.0048195,cone +Semroc,BR-79 [R],Balsa Reducer 7 to 9 � Reversed,TRANSITION,0.0127,0.02413,0.0253492,0.0254,0.0192786,0.0127,0.018161,1,Balsa,0.0048195,cone Semroc,BR-79L,Balsa Reducer 7 to 9,TRANSITION,0.0127,0.018161,0.0192786,0.0508,0.0253492,0.0127,0.02413,1,Balsa,0.0065205,cone -Semroc,BR-79L [R],Balsa Reducer 7 to 9 – Reversed,TRANSITION,0.0127,0.02413,0.0253492,0.0508,0.0192786,0.0127,0.018161,1,Balsa,0.0065205,cone +Semroc,BR-79L [R],Balsa Reducer 7 to 9 � Reversed,TRANSITION,0.0127,0.02413,0.0253492,0.0508,0.0192786,0.0127,0.018161,1,Balsa,0.0065205,cone Semroc,BR-810,Balsa Reducer 8 to 10,TRANSITION,0.0127,0.021971,0.0230632,0.0127,0.026416,0.0127,0.0254,1,Balsa,0.003969,cone -Semroc,BR-810 [R],Balsa Reducer 8 to 10 – Reversed,TRANSITION,0.0127,0.0254,0.026416,0.0127,0.0230632,0.0127,0.021971,1,Balsa,0.003969,cone +Semroc,BR-810 [R],Balsa Reducer 8 to 10 � Reversed,TRANSITION,0.0127,0.0254,0.026416,0.0127,0.0230632,0.0127,0.021971,1,Balsa,0.003969,cone Semroc,BR-813,Balsa Reducer 8 to 13,TRANSITION,0.0127,0.021971,0.0230632,0.04318,0.034036,0.0127,0.03302,1,Balsa,0.007371,cone -Semroc,BR-813 [R],Balsa Reducer 8 to 13 – Reversed,TRANSITION,0.0127,0.03302,0.034036,0.04318,0.0230632,0.0127,0.021971,1,Balsa,0.007371,cone +Semroc,BR-813 [R],Balsa Reducer 8 to 13 � Reversed,TRANSITION,0.0127,0.03302,0.034036,0.04318,0.0230632,0.0127,0.021971,1,Balsa,0.007371,cone Semroc,BR-813P,Balsa Reducer 8 to 13,TRANSITION,0.0127,0.021971,0.0230632,0.0381,0.034036,0.0127,0.03302,1,Balsa,0.007371,cone -Semroc,BR-813P [R],Balsa Reducer 8 to 13 – Reversed,TRANSITION,0.0127,0.03302,0.034036,0.0381,0.0230632,0.0127,0.021971,1,Balsa,0.007371,cone +Semroc,BR-813P [R],Balsa Reducer 8 to 13 � Reversed,TRANSITION,0.0127,0.03302,0.034036,0.0381,0.0230632,0.0127,0.021971,1,Balsa,0.007371,cone Semroc,BR-816,Balsa Reducer 8 to 16,TRANSITION,0.0127,0.021971,0.0230632,0.0381,0.041656,0.0127,0.04064,1,Balsa,0.008505,cone -Semroc,BR-816 [R],Balsa Reducer 8 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0381,0.0230632,0.0127,0.021971,1,Balsa,0.008505,cone +Semroc,BR-816 [R],Balsa Reducer 8 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0381,0.0230632,0.0127,0.021971,1,Balsa,0.008505,cone Semroc,BR-816NT,Balsa Reducer 8 to 16,TRANSITION,0.0127,0.021971,0.0230632,0.04318,0.041656,0.0127,0.04064,1,Balsa,0.010773,cone -Semroc,BR-816NT [R],Balsa Reducer 8 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.04318,0.0230632,0.0127,0.021971,1,Balsa,0.010773,cone +Semroc,BR-816NT [R],Balsa Reducer 8 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.04318,0.0230632,0.0127,0.021971,1,Balsa,0.010773,cone Semroc,BR-8F11,Balsa Reducer 8F to 11,TRANSITION,0.0127,0.022479,0.0233934,0.0254,0.029718,0.0127,0.028702,1,Balsa,0.005103,cone -Semroc,BR-8F11 [R],Balsa Reducer 8F to 11 – Reversed,TRANSITION,0.0127,0.028702,0.029718,0.0254,0.0233934,0.0127,0.022479,1,Balsa,0.005103,cone +Semroc,BR-8F11 [R],Balsa Reducer 8F to 11 � Reversed,TRANSITION,0.0127,0.028702,0.029718,0.0254,0.0233934,0.0127,0.022479,1,Balsa,0.005103,cone Semroc,BR-8F11L,Balsa Reducer 8F to 11,TRANSITION,0.0127,0.022479,0.0233934,0.0381,0.029718,0.0127,0.028702,1,Balsa,0.006237,cone -Semroc,BR-8F11L [R],Balsa Reducer 8F to 11 – Reversed,TRANSITION,0.0127,0.028702,0.029718,0.0381,0.0233934,0.0127,0.022479,1,Balsa,0.006237,cone +Semroc,BR-8F11L [R],Balsa Reducer 8F to 11 � Reversed,TRANSITION,0.0127,0.028702,0.029718,0.0381,0.0233934,0.0127,0.022479,1,Balsa,0.006237,cone Semroc,BR-916,Balsa Reducer 9 to 16,TRANSITION,0.0127,0.02413,0.0253492,0.0508,0.041656,0.0127,0.04064,1,Balsa,0.008505,cone -Semroc,BR-916 [R],Balsa Reducer 9 to 16 – Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0508,0.0253492,0.0127,0.02413,1,Balsa,0.008505,cone +Semroc,BR-916 [R],Balsa Reducer 9 to 16 � Reversed,TRANSITION,0.0127,0.04064,0.041656,0.0508,0.0253492,0.0127,0.02413,1,Balsa,0.008505,cone Semroc,BR-918,Balsa Reducer 9 to 18,TRANSITION,0.0127,0.02413,0.0253492,0.0508,0.046736,0.0127,0.04572,1,Balsa,0.009072,cone -Semroc,BR-918 [R],Balsa Reducer 9 to 18 – Reversed,TRANSITION,0.0127,0.04572,0.046736,0.0508,0.0253492,0.0127,0.02413,1,Balsa,0.009072,cone +Semroc,BR-918 [R],Balsa Reducer 9 to 18 � Reversed,TRANSITION,0.0127,0.04572,0.046736,0.0508,0.0253492,0.0127,0.02413,1,Balsa,0.009072,cone Semroc,BR-920,Balsa Reducer 9 to 20,TRANSITION,0.0127,0.02413,0.0253492,0.0508,0.051816,0.0127,0.0508,1,Balsa,0.009639,cone -Semroc,BR-920 [R],Balsa Reducer 9 to 20 – Reversed,TRANSITION,0.0127,0.0508,0.051816,0.0508,0.0253492,0.0127,0.02413,1,Balsa,0.009639,cone +Semroc,BR-920 [R],Balsa Reducer 9 to 20 � Reversed,TRANSITION,0.0127,0.0508,0.051816,0.0508,0.0253492,0.0127,0.02413,1,Balsa,0.009639,cone Semroc,TA-2050,Balsa Reducer BT-20 to BT-50,TRANSITION,0.0127,0.018034,0.0186944,0.0508,0.0247904,0.0127,0.02413,1,Balsa,0.0048195,cone -Semroc,TA-2050 [R],Balsa Reducer BT-20 to BT-50 – Reversed,TRANSITION,0.0127,0.02413,0.0247904,0.0508,0.0186944,0.0127,0.018034,1,Balsa,0.0048195,cone +Semroc,TA-2050 [R],Balsa Reducer BT-20 to BT-50 � Reversed,TRANSITION,0.0127,0.02413,0.0247904,0.0508,0.0186944,0.0127,0.018034,1,Balsa,0.0048195,cone Semroc,TA-2050A,Balsa Reducer BT-20 to BT-50,TRANSITION,0.0127,0.018034,0.0186944,0.0254,0.0247904,0.0127,0.02413,1,Balsa,0.0031185,cone -Semroc,TA-2050A [R],Balsa Reducer BT-20 to BT-50 – Reversed,TRANSITION,0.0127,0.02413,0.0247904,0.0254,0.0186944,0.0127,0.018034,1,Balsa,0.0031185,cone +Semroc,TA-2050A [R],Balsa Reducer BT-20 to BT-50 � Reversed,TRANSITION,0.0127,0.02413,0.0247904,0.0254,0.0186944,0.0127,0.018034,1,Balsa,0.0031185,cone Semroc,TA-2050B,Balsa Reducer BT-20 to BT-50,TRANSITION,0.0127,0.018034,0.0186944,0.0635,0.0247904,0.0127,0.02413,1,Balsa,0.0059535,cone -Semroc,TA-2050B [R],Balsa Reducer BT-20 to BT-50 – Reversed,TRANSITION,0.0127,0.02413,0.0247904,0.0635,0.0186944,0.0127,0.018034,1,Balsa,0.0059535,cone +Semroc,TA-2050B [R],Balsa Reducer BT-20 to BT-50 � Reversed,TRANSITION,0.0127,0.02413,0.0247904,0.0635,0.0186944,0.0127,0.018034,1,Balsa,0.0059535,cone Semroc,TA-2055,Balsa Reducer BT-20 to BT-55,TRANSITION,0.0127,0.018034,0.0186944,0.0381,0.033655,0.0127,0.0325882,1,Balsa,0.006237,cone -Semroc,TA-2055 [R],Balsa Reducer BT-20 to BT-55 – Reversed,TRANSITION,0.0127,0.0325882,0.033655,0.0381,0.0186944,0.0127,0.018034,1,Balsa,0.006237,cone +Semroc,TA-2055 [R],Balsa Reducer BT-20 to BT-55 � Reversed,TRANSITION,0.0127,0.0325882,0.033655,0.0381,0.0186944,0.0127,0.018034,1,Balsa,0.006237,cone Semroc,TA-2060,Balsa Reducer BT-20 to BT-60,TRANSITION,0.0127,0.018034,0.0186944,0.0508,0.0415798,0.0127,0.040513,1,Balsa,0.00567,cone -Semroc,TA-2060 [R],Balsa Reducer BT-20 to BT-60 – Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0508,0.0186944,0.0127,0.018034,1,Balsa,0.00567,cone +Semroc,TA-2060 [R],Balsa Reducer BT-20 to BT-60 � Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0508,0.0186944,0.0127,0.018034,1,Balsa,0.00567,cone Semroc,TA-5055,Balsa Reducer BT-50 to BT-55,TRANSITION,0.0127,0.02413,0.0247904,0.0254,0.033655,0.0127,0.0325882,1,Balsa,0.01701,cone -Semroc,TA-5055 [R],Balsa Reducer BT-50 to BT-55 – Reversed,TRANSITION,0.0127,0.0325882,0.033655,0.0254,0.0247904,0.0127,0.02413,1,Balsa,0.01701,cone +Semroc,TA-5055 [R],Balsa Reducer BT-50 to BT-55 � Reversed,TRANSITION,0.0127,0.0325882,0.033655,0.0254,0.0247904,0.0127,0.02413,1,Balsa,0.01701,cone Semroc,TA-5055L,Balsa Reducer BT-50 to BT-55,TRANSITION,0.0127,0.02413,0.0247904,0.0381,0.033655,0.0127,0.0325882,1,Balsa,0.0201285,cone -Semroc,TA-5055L [R],Balsa Reducer BT-50 to BT-55 – Reversed,TRANSITION,0.0127,0.0325882,0.033655,0.0381,0.0247904,0.0127,0.02413,1,Balsa,0.0201285,cone +Semroc,TA-5055L [R],Balsa Reducer BT-50 to BT-55 � Reversed,TRANSITION,0.0127,0.0325882,0.033655,0.0381,0.0247904,0.0127,0.02413,1,Balsa,0.0201285,cone Semroc,TA-5060,Balsa Reducer BT-50 to BT-60,TRANSITION,0.0127,0.02413,0.0247904,0.0508,0.0415798,0.0127,0.040513,1,Balsa,0.0065205,cone -Semroc,TA-5060 [R],Balsa Reducer BT-50 to BT-60 – Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0508,0.0247904,0.0127,0.02413,1,Balsa,0.0065205,cone +Semroc,TA-5060 [R],Balsa Reducer BT-50 to BT-60 � Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0508,0.0247904,0.0127,0.02413,1,Balsa,0.0065205,cone Semroc,TA-5060C,Balsa Reducer BT-50 to BT-60,TRANSITION,0.0127,0.02413,0.0247904,0.0127,0.0415798,0.0127,0.040513,1,Balsa,0.003969,cone -Semroc,TA-5060C [R],Balsa Reducer BT-50 to BT-60 – Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0127,0.0247904,0.0127,0.02413,1,Balsa,0.003969,cone +Semroc,TA-5060C [R],Balsa Reducer BT-50 to BT-60 � Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0127,0.0247904,0.0127,0.02413,1,Balsa,0.003969,cone Semroc,TA-5060E,Balsa Reducer BT-50 to BT-60,TRANSITION,0.0127,0.02413,0.0247904,0.0508,0.0415798,0.0127,0.040513,1,Balsa,0.0059535,elliptical -Semroc,TA-5060E [R],Balsa Reducer BT-50 to BT-60 – Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0508,0.0247904,0.0127,0.02413,1,Balsa,0.0059535,elliptical +Semroc,TA-5060E [R],Balsa Reducer BT-50 to BT-60 � Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0508,0.0247904,0.0127,0.02413,1,Balsa,0.0059535,elliptical Semroc,TA-5065,Balsa Reducer BT-50 to BT-65,TRANSITION,0.0127,0.02413,0.0247904,0.0508,0.0456184,0.0127,0.04445,1,Balsa,0.007371,cone -Semroc,TA-5065 [R],Balsa Reducer BT-50 to BT-65 – Reversed,TRANSITION,0.0127,0.04445,0.0456184,0.0508,0.0247904,0.0127,0.02413,1,Balsa,0.007371,cone +Semroc,TA-5065 [R],Balsa Reducer BT-50 to BT-65 � Reversed,TRANSITION,0.0127,0.04445,0.0456184,0.0508,0.0247904,0.0127,0.02413,1,Balsa,0.007371,cone Semroc,TA-520,Balsa Reducer BT-5 to BT-20,TRANSITION,0.0127,0.013081,0.0137414,0.01905,0.0186944,0.0127,0.018034,1,Balsa,0.001134,cone -Semroc,TA-520 [R],Balsa Reducer BT-5 to BT-20 – Reversed,TRANSITION,0.0127,0.018034,0.0186944,0.01905,0.0137414,0.0127,0.013081,1,Balsa,0.001134,cone +Semroc,TA-520 [R],Balsa Reducer BT-5 to BT-20 � Reversed,TRANSITION,0.0127,0.018034,0.0186944,0.01905,0.0137414,0.0127,0.013081,1,Balsa,0.001134,cone Semroc,TA-5260A,Balsa Reducer BT-52 to BT-60,TRANSITION,0.0127,0.0250952,0.0257556,0.0254,0.0415798,0.0127,0.040513,1,Balsa,0.0065205,cone -Semroc,TA-5260A [R],Balsa Reducer BT-52 to BT-60 – Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0254,0.0257556,0.0127,0.0250952,1,Balsa,0.0065205,cone +Semroc,TA-5260A [R],Balsa Reducer BT-52 to BT-60 � Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0254,0.0257556,0.0127,0.0250952,1,Balsa,0.0065205,cone Semroc,TA-5260C,Balsa Reducer BT-52 to BT-60,TRANSITION,0.0127,0.0250952,0.0257556,0.09652,0.0415798,0.0127,0.040513,1,Balsa,0.0093555,cone -Semroc,TA-5260C [R],Balsa Reducer BT-52 to BT-60 – Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.09652,0.0257556,0.0127,0.0250952,1,Balsa,0.0093555,cone +Semroc,TA-5260C [R],Balsa Reducer BT-52 to BT-60 � Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.09652,0.0257556,0.0127,0.0250952,1,Balsa,0.0093555,cone Semroc,TA-550,Balsa Reducer BT-5 to BT-50,TRANSITION,0.0127,0.013081,0.0137414,0.0254,0.0247904,0.0127,0.02413,1,Balsa,0.001701,cone -Semroc,TA-550 [R],Balsa Reducer BT-5 to BT-50 – Reversed,TRANSITION,0.0127,0.02413,0.0247904,0.0254,0.0137414,0.0127,0.013081,1,Balsa,0.001701,cone +Semroc,TA-550 [R],Balsa Reducer BT-5 to BT-50 � Reversed,TRANSITION,0.0127,0.02413,0.0247904,0.0254,0.0137414,0.0127,0.013081,1,Balsa,0.001701,cone Semroc,TA-5560,Balsa Reducer BT-55 to BT-60,TRANSITION,0.0127,0.0325882,0.033655,0.0254,0.0415798,0.0127,0.040513,1,Balsa,0.0070875,cone -Semroc,TA-5560 [R],Balsa Reducer BT-55 to BT-60 – Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0254,0.033655,0.0127,0.0325882,1,Balsa,0.0070875,cone +Semroc,TA-5560 [R],Balsa Reducer BT-55 to BT-60 � Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.0254,0.033655,0.0127,0.0325882,1,Balsa,0.0070875,cone Semroc,TA-5560A,Balsa Reducer BT-55 to BT-60,TRANSITION,0.0127,0.0325882,0.033655,0.03175,0.0415798,0.0127,0.040513,1,Balsa,0.0082215,cone -Semroc,TA-5560A [R],Balsa Reducer BT-55 to BT-60 – Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.03175,0.033655,0.0127,0.0325882,1,Balsa,0.0082215,cone +Semroc,TA-5560A [R],Balsa Reducer BT-55 to BT-60 � Reversed,TRANSITION,0.0127,0.040513,0.0415798,0.03175,0.033655,0.0127,0.0325882,1,Balsa,0.0082215,cone Semroc,TA-5565,Balsa Reducer BT-55 to BT-65,TRANSITION,0.0127,0.0325882,0.033655,0.0381,0.0456184,0.0127,0.04445,1,Balsa,0.010773,cone -Semroc,TA-5565 [R],Balsa Reducer BT-55 to BT-65 – Reversed,TRANSITION,0.0127,0.04445,0.0456184,0.0381,0.033655,0.0127,0.0325882,1,Balsa,0.010773,cone +Semroc,TA-5565 [R],Balsa Reducer BT-55 to BT-65 � Reversed,TRANSITION,0.0127,0.04445,0.0456184,0.0381,0.033655,0.0127,0.0325882,1,Balsa,0.010773,cone Semroc,TA-6065,Balsa Reducer BT-60 to BT-65,TRANSITION,0.0127,0.040513,0.0415798,0.0127,0.0456184,0.0127,0.04445,1,Balsa,0.0065205,cone -Semroc,TA-6065 [R],Balsa Reducer BT-60 to BT-65 – Reversed,TRANSITION,0.0127,0.04445,0.0456184,0.0127,0.0415798,0.0127,0.040513,1,Balsa,0.0065205,cone +Semroc,TA-6065 [R],Balsa Reducer BT-60 to BT-65 � Reversed,TRANSITION,0.0127,0.04445,0.0456184,0.0127,0.0415798,0.0127,0.040513,1,Balsa,0.0065205,cone Semroc,TA-6070,Balsa Reducer BT-60 to BT-70,TRANSITION,0.0127,0.040513,0.0415798,0.0381,0.0563118,0.0127,0.055245,1,Balsa,0.0184275,cone -Semroc,TA-6070 [R],Balsa Reducer BT-60 to BT-70 – Reversed,TRANSITION,0.0127,0.055245,0.0563118,0.0381,0.0415798,0.0127,0.040513,1,Balsa,0.0184275,cone +Semroc,TA-6070 [R],Balsa Reducer BT-60 to BT-70 � Reversed,TRANSITION,0.0127,0.055245,0.0563118,0.0381,0.0415798,0.0127,0.040513,1,Balsa,0.0184275,cone Semroc,TA-6080,Balsa Reducer BT-60 to BT-80,TRANSITION,0.0127,0.040513,0.0415798,0.0381,0.06604,0.0127,0.0649732,1,Balsa,0.0184275,cone -Semroc,TA-6080 [R],Balsa Reducer BT-60 to BT-80 – Reversed,TRANSITION,0.0127,0.0649732,0.06604,0.0381,0.0415798,0.0127,0.040513,1,Balsa,0.0184275,cone +Semroc,TA-6080 [R],Balsa Reducer BT-60 to BT-80 � Reversed,TRANSITION,0.0127,0.0649732,0.06604,0.0381,0.0415798,0.0127,0.040513,1,Balsa,0.0184275,cone Semroc,TA-7080,Balsa Reducer BT-70 to BT-80,TRANSITION,0.0127,0.055245,0.0563118,0.0381,0.06604,0.0127,0.0649732,1,Balsa,0.0184275,cone -Semroc,TA-7080 [R],Balsa Reducer BT-70 to BT-80 – Reversed,TRANSITION,0.0127,0.0649732,0.06604,0.0381,0.0563118,0.0127,0.055245,1,Balsa,0.0184275,cone +Semroc,TA-7080 [R],Balsa Reducer BT-70 to BT-80 � Reversed,TRANSITION,0.0127,0.0649732,0.06604,0.0381,0.0563118,0.0127,0.055245,1,Balsa,0.0184275,cone diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index e1072d0b..02977c5b 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -1607,8 +1607,9 @@ table.column.Type = Type table.column.Length = Length table.column.InnerDiameter = Inner Diameter table.column.OuterDiameter = Outer Diameter -table.column.ShoulderLength = Shoulder Length -table.column.ShoulderDiameter = Shoulder Diameter +table.column.AftOuterDiameter = Aft Outer Diameter +table.column.AftShoulderLength = Aft Shoulder Length +table.column.AftShoulderDiameter = Aft Shoulder Diameter table.column.ForeShoulderLength = Fore Shoulder Length table.column.ForeShoulderDiameter = Fore Shoulder Diameter table.column.ForeOuterDiameter = Fore Outer Diameter diff --git a/core/src/net/sf/openrocket/preset/ComponentPreset.java b/core/src/net/sf/openrocket/preset/ComponentPreset.java index 3da35755..38eb50cc 100644 --- a/core/src/net/sf/openrocket/preset/ComponentPreset.java +++ b/core/src/net/sf/openrocket/preset/ComponentPreset.java @@ -50,8 +50,8 @@ public class ComponentPreset implements Comparable { ComponentPreset.PARTNO, ComponentPreset.DESCRIPTION, ComponentPreset.SHAPE, - ComponentPreset.OUTER_DIAMETER, - ComponentPreset.SHOULDER_DIAMETER, + ComponentPreset.AFT_OUTER_DIAMETER, + ComponentPreset.AFT_SHOULDER_DIAMETER, ComponentPreset.LENGTH} ), TRANSITION( new TypedKey[] { @@ -129,8 +129,6 @@ public class ComponentPreset implements Comparable { public final static TypedKey LENGTH = new TypedKey("Length", Double.class, UnitGroup.UNITS_LENGTH); public final static TypedKey INNER_DIAMETER = new TypedKey("InnerDiameter", Double.class, UnitGroup.UNITS_LENGTH); public final static TypedKey OUTER_DIAMETER = new TypedKey("OuterDiameter", Double.class, UnitGroup.UNITS_LENGTH); - public final static TypedKey SHOULDER_LENGTH = new TypedKey("ShoulderLength", Double.class, UnitGroup.UNITS_LENGTH); - public final static TypedKey SHOULDER_DIAMETER = new TypedKey("ShoulderDiameter", Double.class, UnitGroup.UNITS_LENGTH); public final static TypedKey FORE_SHOULDER_LENGTH = new TypedKey("ForeShoulderLength",Double.class, UnitGroup.UNITS_LENGTH); public final static TypedKey FORE_SHOULDER_DIAMETER = new TypedKey("ForeShoulderDiameter",Double.class, UnitGroup.UNITS_LENGTH); public final static TypedKey FORE_OUTER_DIAMETER = new TypedKey("ForeOuterDiameter", Double.class, UnitGroup.UNITS_LENGTH); @@ -153,11 +151,12 @@ public class ComponentPreset implements Comparable { keyMap.put(LENGTH.getName(), LENGTH); keyMap.put(INNER_DIAMETER.getName(), INNER_DIAMETER); keyMap.put(OUTER_DIAMETER.getName(), OUTER_DIAMETER); - keyMap.put(SHOULDER_LENGTH.getName(), SHOULDER_LENGTH); - keyMap.put(SHOULDER_DIAMETER.getName(), SHOULDER_DIAMETER); keyMap.put(FORE_SHOULDER_LENGTH.getName(), FORE_SHOULDER_LENGTH); keyMap.put(FORE_SHOULDER_DIAMETER.getName(), FORE_SHOULDER_DIAMETER); keyMap.put(FORE_OUTER_DIAMETER.getName(), FORE_OUTER_DIAMETER); + keyMap.put(AFT_SHOULDER_LENGTH.getName(), AFT_SHOULDER_LENGTH); + keyMap.put(AFT_SHOULDER_DIAMETER.getName(), AFT_SHOULDER_DIAMETER); + keyMap.put(AFT_OUTER_DIAMETER.getName(), AFT_OUTER_DIAMETER); keyMap.put(SHAPE.getName(), SHAPE); keyMap.put(MATERIAL.getName(), MATERIAL); keyMap.put(FINISH.getName(), FINISH); @@ -171,10 +170,12 @@ public class ComponentPreset implements Comparable { PARTNO, DESCRIPTION, OUTER_DIAMETER, + FORE_OUTER_DIAMETER, + AFT_OUTER_DIAMETER, INNER_DIAMETER, LENGTH, - SHOULDER_DIAMETER, - SHOULDER_LENGTH, + AFT_SHOULDER_DIAMETER, + AFT_SHOULDER_LENGTH, FORE_SHOULDER_DIAMETER, FORE_SHOULDER_LENGTH, SHAPE, diff --git a/core/src/net/sf/openrocket/preset/ComponentPresetFactory.java b/core/src/net/sf/openrocket/preset/ComponentPresetFactory.java index 5cf7f62e..9aab9125 100644 --- a/core/src/net/sf/openrocket/preset/ComponentPresetFactory.java +++ b/core/src/net/sf/openrocket/preset/ComponentPresetFactory.java @@ -1,20 +1,8 @@ package net.sf.openrocket.preset; -import static net.sf.openrocket.preset.ComponentPreset.FORE_OUTER_DIAMETER; -import static net.sf.openrocket.preset.ComponentPreset.INNER_DIAMETER; -import static net.sf.openrocket.preset.ComponentPreset.LENGTH; -import static net.sf.openrocket.preset.ComponentPreset.MANUFACTURER; -import static net.sf.openrocket.preset.ComponentPreset.MASS; -import static net.sf.openrocket.preset.ComponentPreset.MATERIAL; -import static net.sf.openrocket.preset.ComponentPreset.OUTER_DIAMETER; -import static net.sf.openrocket.preset.ComponentPreset.PARTNO; -import static net.sf.openrocket.preset.ComponentPreset.SHAPE; -import static net.sf.openrocket.preset.ComponentPreset.THICKNESS; -import static net.sf.openrocket.preset.ComponentPreset.TYPE; +import static net.sf.openrocket.preset.ComponentPreset.*; import net.sf.openrocket.material.Material; import net.sf.openrocket.preset.ComponentPreset.Type; -import net.sf.openrocket.rocketcomponent.BodyTube; -import net.sf.openrocket.rocketcomponent.Bulkhead; import net.sf.openrocket.rocketcomponent.NoseCone; import net.sf.openrocket.rocketcomponent.Transition; @@ -58,7 +46,8 @@ public abstract class ComponentPresetFactory { break; } case TUBE_COUPLER: { - makeTubeCoupler(preset); + // For now TUBE_COUPLER is the same as BODY_TUBE + makeBodyTube(preset); break; } case CENTERING_RING: { @@ -100,7 +89,7 @@ public abstract class ComponentPresetFactory { private static void makeNoseCone( ComponentPreset preset ) throws InvalidComponentPresetException { - checkRequiredFields( preset, LENGTH, SHAPE, OUTER_DIAMETER ); + checkRequiredFields( preset, LENGTH, SHAPE, AFT_OUTER_DIAMETER ); if ( preset.has(MASS) ) { // compute a density for this component @@ -122,7 +111,7 @@ public abstract class ComponentPresetFactory { } private static void makeTransition( ComponentPreset preset ) throws InvalidComponentPresetException { - checkRequiredFields(preset, LENGTH, OUTER_DIAMETER, FORE_OUTER_DIAMETER); + checkRequiredFields(preset, LENGTH, AFT_OUTER_DIAMETER, FORE_OUTER_DIAMETER); if ( preset.has(MASS) ) { // compute a density for this component @@ -167,25 +156,6 @@ public abstract class ComponentPresetFactory { } - private static void makeTubeCoupler( ComponentPreset preset ) throws InvalidComponentPresetException { - - checkRequiredFields( preset, LENGTH ); - - checkDiametersAndThickness( preset ); - - double volume = computeVolumeOfTube( preset ); - - // Need to translate Mass to Density. - if ( preset.has(MASS) ) { - String materialName = "TubeCouplerCustom"; - if ( preset.has(MATERIAL) ) { - materialName = preset.get(MATERIAL).getName(); - } - Material m = Material.newMaterial(Material.Type.BULK, materialName, preset.get(MASS)/volume, false); - preset.put(MATERIAL, m); - } - } - private static void makeCenteringRing( ComponentPreset preset ) throws InvalidComponentPresetException { checkRequiredFields( preset, LENGTH ); @@ -195,7 +165,7 @@ public abstract class ComponentPresetFactory { // Need to translate Mass to Density. if ( preset.has(MASS) ) { - String materialName = "TubeCouplerCustom"; + String materialName = "CenteringRingCustom"; if ( preset.has(MATERIAL) ) { materialName = preset.get(MATERIAL).getName(); } @@ -214,7 +184,7 @@ public abstract class ComponentPresetFactory { // Need to translate Mass to Density. if ( preset.has(MASS) ) { - String materialName = "TubeCouplerCustom"; + String materialName = "EngineBlockCustom"; if ( preset.has(MATERIAL) ) { materialName = preset.get(MATERIAL).getName(); } @@ -255,7 +225,7 @@ public abstract class ComponentPresetFactory { throw new InvalidComponentPresetException("Preset underspecified " + preset.toString()); } } else { - if ( ! hasId && ! hasThickness ) { + if ( ! hasId || ! hasThickness ) { throw new InvalidComponentPresetException("Preset underspecified " + preset.toString()); } innerRadius = preset.get(INNER_DIAMETER)/2.0; diff --git a/core/src/net/sf/openrocket/preset/loader/RocksimComponentFileLoader.java b/core/src/net/sf/openrocket/preset/loader/RocksimComponentFileLoader.java index 98c465ff..73075c46 100644 --- a/core/src/net/sf/openrocket/preset/loader/RocksimComponentFileLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/RocksimComponentFileLoader.java @@ -395,10 +395,10 @@ public class RocksimComponentFileLoader { keyMap.add(DESCRIPTION_INDEX, ComponentPreset.DESCRIPTION); keyMap.add(UNITS_INDEX, UNITS_OF_MEASURE); keyMap.add(LENGTH_INDEX, ComponentPreset.LENGTH); - keyMap.add(OUTER_DIA_INDEX, ComponentPreset.OUTER_DIAMETER); + keyMap.add(OUTER_DIA_INDEX, ComponentPreset.AFT_OUTER_DIAMETER); keyMap.add(LD_RATIO_INDEX, LD_RATIO); - keyMap.add(INSERT_LENGTH_INDEX, ComponentPreset.SHOULDER_LENGTH); - keyMap.add(INSERT_OD_INDEX, ComponentPreset.SHOULDER_DIAMETER); + keyMap.add(INSERT_LENGTH_INDEX, ComponentPreset.AFT_SHOULDER_LENGTH); + keyMap.add(INSERT_OD_INDEX, ComponentPreset.AFT_SHOULDER_DIAMETER); keyMap.add(THICKNESS_INDEX, ComponentPreset.THICKNESS); keyMap.add(SHAPE_INDEX, ComponentPreset.SHAPE); keyMap.add(CONFIG_INDEX, CONFIG); @@ -456,10 +456,10 @@ public class RocksimComponentFileLoader { keyMap.add(FRONT_INSERT_OD_INDEX, ComponentPreset.FORE_SHOULDER_DIAMETER); keyMap.add(FRONT_OD_INDEX, ComponentPreset.FORE_OUTER_DIAMETER); keyMap.add(LENGTH_INDEX, ComponentPreset.LENGTH); - keyMap.add(REAR_OD_INDEX, ComponentPreset.OUTER_DIAMETER); + keyMap.add(REAR_OD_INDEX, ComponentPreset.AFT_OUTER_DIAMETER); keyMap.add(CORE_DIA_INDEX, IGNORE); - keyMap.add(REAR_INSERT_LENGTH_INDEX, ComponentPreset.SHOULDER_LENGTH); - keyMap.add(REAR_INSERT_OD_INDEX, ComponentPreset.SHOULDER_DIAMETER); + keyMap.add(REAR_INSERT_LENGTH_INDEX, ComponentPreset.AFT_SHOULDER_LENGTH); + keyMap.add(REAR_INSERT_OD_INDEX, ComponentPreset.AFT_SHOULDER_DIAMETER); keyMap.add(THICKNESS_INDEX, ComponentPreset.THICKNESS); keyMap.add(CONFIG_INDEX, CONFIG); keyMap.add(MATERIAL_INDEX, ComponentPreset.MATERIAL); diff --git a/core/src/net/sf/openrocket/rocketcomponent/Bulkhead.java b/core/src/net/sf/openrocket/rocketcomponent/Bulkhead.java index f638f09f..36822c4d 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Bulkhead.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Bulkhead.java @@ -32,6 +32,7 @@ public class Bulkhead extends RadiusRingComponent { @Override public void setOuterRadiusAutomatic(boolean auto) { super.setOuterRadiusAutomatic(auto); + clearPreset(); } @Override diff --git a/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java index e7984621..6d0ccb65 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java @@ -61,6 +61,7 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi innerRadiusAutomatic = false; } + clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -82,6 +83,7 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi outerRadiusAutomatic = false; } + clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/StructuralComponent.java b/core/src/net/sf/openrocket/rocketcomponent/StructuralComponent.java index a224c9e5..b7143c68 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/StructuralComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/StructuralComponent.java @@ -49,6 +49,7 @@ public abstract class StructuralComponent extends InternalComponent { if (mat.equals(material)) return; this.material = mat; + clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java b/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java index 3a8fcd9c..c2d0a9bd 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java @@ -63,6 +63,8 @@ public abstract class ThicknessRingComponent extends RingComponent { if (thickness > outerRadius) thickness = outerRadius; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -82,6 +84,8 @@ public abstract class ThicknessRingComponent extends RingComponent { this.thickness = thickness; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/Transition.java b/core/src/net/sf/openrocket/rocketcomponent/Transition.java index 1a7ba10e..fd52699b 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Transition.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Transition.java @@ -53,7 +53,16 @@ public class Transition extends SymmetricComponent { this.clipped = true; } - + //////// Length //////// + @Override + public void setLength( double length ) { + if ( this.length == length ) { + return; + } + // Need to clearPreset when length changes. + clearPreset(); + super.setLength( length ); + } //////// Fore radius //////// @@ -84,6 +93,8 @@ public class Transition extends SymmetricComponent { if (this.thickness > this.radius1 && this.thickness > this.radius2) this.thickness = Math.max(this.radius1, this.radius2); + + clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -97,6 +108,8 @@ public class Transition extends SymmetricComponent { return; autoRadius1 = auto; + + clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -130,6 +143,8 @@ public class Transition extends SymmetricComponent { if (this.thickness > this.radius1 && this.thickness > this.radius2) this.thickness = Math.max(this.radius1, this.radius2); + + clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -143,6 +158,8 @@ public class Transition extends SymmetricComponent { return; autoRadius2 = auto; + + clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -233,6 +250,7 @@ public class Transition extends SymmetricComponent { if (MathUtil.equals(this.foreShoulderRadius, foreShoulderRadius)) return; this.foreShoulderRadius = foreShoulderRadius; + clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -280,6 +298,7 @@ public class Transition extends SymmetricComponent { if (MathUtil.equals(this.aftShoulderRadius, aftShoulderRadius)) return; this.aftShoulderRadius = aftShoulderRadius; + clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -529,17 +548,17 @@ public class Transition extends SymmetricComponent { Shape s = preset.get(ComponentPreset.SHAPE); this.setType(s); } - if ( preset.has(ComponentPreset.OUTER_DIAMETER) ) { - double outerDiameter = preset.get(ComponentPreset.OUTER_DIAMETER); + if ( preset.has(ComponentPreset.AFT_OUTER_DIAMETER) ) { + double outerDiameter = preset.get(ComponentPreset.AFT_OUTER_DIAMETER); this.setAftRadiusAutomatic(false); this.setAftRadius(outerDiameter/2.0); } - if ( preset.has(ComponentPreset.SHOULDER_LENGTH) ) { - double d = preset.get(ComponentPreset.SHOULDER_LENGTH); + if ( preset.has(ComponentPreset.AFT_SHOULDER_LENGTH) ) { + double d = preset.get(ComponentPreset.AFT_SHOULDER_LENGTH); this.setAftShoulderLength(d); } - if ( preset.has(ComponentPreset.SHOULDER_DIAMETER) ) { - double d = preset.get(ComponentPreset.SHOULDER_DIAMETER); + if ( preset.has(ComponentPreset.AFT_SHOULDER_DIAMETER) ) { + double d = preset.get(ComponentPreset.AFT_SHOULDER_DIAMETER); this.setAftShoulderRadius(d/2.0); } if ( preset.has(ComponentPreset.FORE_OUTER_DIAMETER) ) { diff --git a/core/test/net/sf/openrocket/preset/BodyTubeComponentTests.java b/core/test/net/sf/openrocket/preset/BodyTubeComponentTests.java new file mode 100644 index 00000000..bac720a6 --- /dev/null +++ b/core/test/net/sf/openrocket/preset/BodyTubeComponentTests.java @@ -0,0 +1,142 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.*; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.rocketcomponent.BodyTube; +import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +import org.junit.Before; +import org.junit.Test; + +/** + * Test application of ComponentPresets to BodyTube RocketComponents through + * the BodyTube.loadFromPreset mechanism. + * + * Test BodyTube is well defined. + * + * Test calling setters on BodyTube will clear the ComponentPreset. + * + */ +public class BodyTubeComponentTests extends BaseTestCase { + + ComponentPreset preset; + + @Before + public void createPreset() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + preset = ComponentPresetFactory.create(presetspec); + } + + @Test + public void testComponentType() { + BodyTube bt = new BodyTube(); + + assertSame( ComponentPreset.Type.BODY_TUBE, bt.getPresetType() ); + } + + @Test + public void testLoadFromPresetIsSane() { + BodyTube bt = new BodyTube(); + + bt.loadPreset(preset); + + assertEquals( 2.0, bt.getLength(), 0.0 ); + assertEquals( 1.0, bt.getOuterRadius(), 0.0 ); + assertEquals( 1.0, bt.getAftRadius(), 0.0 ); + assertEquals( 0.5, bt.getInnerRadius(), 0.0 ); + + assertFalse( bt.isAftRadiusAutomatic() ); + assertFalse( bt.isFilled() ); + assertFalse( bt.isForeRadiusAutomatic() ); + assertFalse( bt.isOuterRadiusAutomatic() ); + + assertSame( preset.get( ComponentPreset.MATERIAL), bt.getMaterial() ); + assertEquals( 100.0, bt.getMass(), 0.05); + } + + @Test + public void changeLengthLeavesPreset() { + BodyTube bt = new BodyTube(); + + bt.loadPreset(preset); + + bt.setLength(1.0); + + assertSame( preset, bt.getPresetComponent() ); + } + + @Test + public void changeODClearsPreset() { + BodyTube bt = new BodyTube(); + + bt.loadPreset(preset); + + bt.setOuterRadius(2.0); + + assertNull( bt.getPresetComponent() ); + } + + @Test + public void changeIDClearsPreset() { + BodyTube bt = new BodyTube(); + + bt.loadPreset(preset); + + bt.setInnerRadius(0.75); + + assertNull( bt.getPresetComponent() ); + } + + @Test + public void changeThicknessClearsPreset() { + BodyTube bt = new BodyTube(); + + bt.loadPreset(preset); + + bt.setThickness(0.1); + + assertNull( bt.getPresetComponent() ); + } + + @Test + public void changeMaterialClearsPreset() { + BodyTube bt = new BodyTube(); + + bt.loadPreset(preset); + + bt.setMaterial( new Material.Bulk("new", 1.0, true)); + + assertNull( bt.getPresetComponent() ); + } + + @Test + public void changeFinishLeavesPreset() { + BodyTube bt = new BodyTube(); + + bt.loadPreset(preset); + + bt.setFinish( Finish.POLISHED ); + + assertSame( preset, bt.getPresetComponent() ); + } + + @Test + public void changeFillClearsPreset() { + BodyTube bt = new BodyTube(); + + bt.loadPreset(preset); + + bt.setFilled( true ); + + assertNull( bt.getPresetComponent() ); + } +} diff --git a/core/test/net/sf/openrocket/preset/BodyTubePresetTests.java b/core/test/net/sf/openrocket/preset/BodyTubePresetTests.java new file mode 100644 index 00000000..71582682 --- /dev/null +++ b/core/test/net/sf/openrocket/preset/BodyTubePresetTests.java @@ -0,0 +1,227 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; + +import org.junit.Test; + +/** + * Test construction of BODY_TUBE type ComponentPresets based on TypedPropertyMap through the + * ComponentPresetFactory.create() method. + * + * Ensure required properties are populated + * + * Ensure any computed values are correctly computed. + * + */ +public class BodyTubePresetTests { + + @Test + public void testManufacturerRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Manufacturer specified")); + } + } + + @Test + public void testPartNoRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No PartNo specified")); + } + } + + @Test + public void testLengthRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Length specified")); + } + } + + @Test + public void testOnlyOuterDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testOnlyInnerDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testOnlyThicknessDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.THICKNESS, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testComputeInnerDiameter() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.THICKNESS, 0.5); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(1.0,preset.get(ComponentPreset.INNER_DIAMETER).doubleValue(),0.0); + } + + @Test + public void testComputeOuterDiameter() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.THICKNESS, 0.5); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(2.0,preset.get(ComponentPreset.OUTER_DIAMETER).doubleValue(),0.0); + } + + @Test + public void testComputeThickness() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(0.5,preset.get(ComponentPreset.THICKNESS).doubleValue(),0.0); + } + + @Test + public void testComputeThicknessLooses() throws Exception { + // If all OUTER_DIAMETER, INNER_DIAMETER and THICKNESS are + // specified, THICKNESS is recomputed. + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.THICKNESS, 15.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(0.5,preset.get(ComponentPreset.THICKNESS).doubleValue(),0.0); + } + + @Test + public void testComputeDensityNoMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // Compute the volume by hand here using a slightly different formula from + // the real implementation. The magic numbers are based on the + // constants put into the presetspec above. + double volume = /*outer area*/ (Math.PI * 1.0) - /* inner area */ (Math.PI * .25); + volume *= 2.0; /* times length */ + + double density = 100.0 / volume; + + assertEquals("TubeCustom",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + } + + @Test + public void testMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(2.0,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + + } + + @Test + public void testComputeDensityWithMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BODY_TUBE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // Compute the volume by hand here using a slightly different formula from + // the real implementation. The magic numbers are based on the + // constants put into the presetspec above. + double volume = /*outer area*/ (Math.PI * 1.0) - /* inner area */ (Math.PI * .25); + volume *= 2.0; /* times length */ + + double density = 100.0 / volume; + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + } + +} diff --git a/core/test/net/sf/openrocket/preset/BulkHeadComponentTests.java b/core/test/net/sf/openrocket/preset/BulkHeadComponentTests.java new file mode 100644 index 00000000..5a7e2be2 --- /dev/null +++ b/core/test/net/sf/openrocket/preset/BulkHeadComponentTests.java @@ -0,0 +1,106 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.rocketcomponent.Bulkhead; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +import org.junit.Before; +import org.junit.Test; + +/** + * Test application of ComponentPresets to Bulkhead RocketComponents through + * the Bulkhead.loadFromPreset mechanism. + * + * Test Bulkhead is well defined. + * + * Test calling setters on Bulkhead will clear the ComponentPreset. + * + */ +public class BulkHeadComponentTests extends BaseTestCase { + + ComponentPreset preset; + + @Before + public void createPreset() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BULK_HEAD); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.MASS, 100.0); + preset = ComponentPresetFactory.create(presetspec); + } + + @Test + public void testComponentType() { + Bulkhead bt = new Bulkhead(); + + assertSame( ComponentPreset.Type.BULK_HEAD, bt.getPresetType() ); + } + + @Test + public void testLoadFromPresetIsSane() { + Bulkhead bt = new Bulkhead(); + + bt.loadPreset(preset); + + assertEquals( 2.0, bt.getLength(), 0.0 ); + assertEquals( 1.0, bt.getOuterRadius(), 0.0 ); + + assertFalse( bt.isOuterRadiusAutomatic() ); + + assertSame( preset.get( ComponentPreset.MATERIAL), bt.getMaterial() ); + assertEquals( 100.0, bt.getMass(), 0.05); + } + + @Test + public void changeLengthLeavesPreset() { + Bulkhead bt = new Bulkhead(); + + bt.loadPreset(preset); + + bt.setLength(1.0); + + assertSame( preset, bt.getPresetComponent() ); + } + + @Test + public void changeODClearsPreset() { + Bulkhead bt = new Bulkhead(); + + bt.loadPreset(preset); + + bt.setOuterRadius(2.0); + + assertNull( bt.getPresetComponent() ); + } + + @Test + public void changeODAutomaticClearsPreset() { + Bulkhead bt = new Bulkhead(); + + bt.loadPreset(preset); + + bt.setOuterRadiusAutomatic(true); + + assertNull( bt.getPresetComponent() ); + } + + @Test + public void changeMaterialClearsPreset() { + Bulkhead bt = new Bulkhead(); + + bt.loadPreset(preset); + + bt.setMaterial( new Material.Bulk("new", 1.0, true)); + + assertNull( bt.getPresetComponent() ); + } + +} diff --git a/core/test/net/sf/openrocket/preset/BulkHeadPresetTests.java b/core/test/net/sf/openrocket/preset/BulkHeadPresetTests.java new file mode 100644 index 00000000..047fe139 --- /dev/null +++ b/core/test/net/sf/openrocket/preset/BulkHeadPresetTests.java @@ -0,0 +1,134 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; + +import org.junit.Test; + +/** + * Test construction of BULK_HEAD type ComponentPresets based on TypedPropertyMap through the + * ComponentPresetFactory.create() method. + * + * Ensure required properties are populated + * + * Ensure any computed values are correctly computed. + * + */ +public class BulkHeadPresetTests { + + @Test + public void testManufacturerRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BULK_HEAD); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Manufacturer specified")); + } + } + + @Test + public void testPartNoRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BULK_HEAD); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No PartNo specified")); + } + } + + @Test + public void testLengthRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BULK_HEAD); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Length specified")); + } + } + + @Test + public void testOuterDiameterRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BULK_HEAD); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No OuterDiameter specified")); + } + } + + @Test + public void testComputeDensityNoMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BULK_HEAD); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.MASS, 100.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // Compute the volume by hand here using a slightly different formula from + // the real implementation. The magic numbers are based on the + // constants put into the presetspec above. + double volume = /*outer area*/ (Math.PI * 1.0); + volume *= 2.0; /* times length */ + + double density = 100.0 / volume; + + assertEquals("BulkHeadCustom",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + } + + @Test + public void testMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BULK_HEAD); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(2.0,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + + } + + @Test + public void testComputeDensityWithMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.BULK_HEAD); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.MASS, 100.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // Compute the volume by hand here using a slightly different formula from + // the real implementation. The magic numbers are based on the + // constants put into the presetspec above. + double volume = /*outer area*/ (Math.PI * 1.0); + volume *= 2.0; /* times length */ + + double density = 100.0 / volume; + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + } + +} diff --git a/core/test/net/sf/openrocket/preset/CenteringRingComponentTests.java b/core/test/net/sf/openrocket/preset/CenteringRingComponentTests.java new file mode 100644 index 00000000..51549e55 --- /dev/null +++ b/core/test/net/sf/openrocket/preset/CenteringRingComponentTests.java @@ -0,0 +1,119 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.rocketcomponent.CenteringRing; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +import org.junit.Before; +import org.junit.Test; + +/** + * Test application of ComponentPresets to CenteringRing RocketComponents through + * the CenteringRing.loadFromPreset mechanism. + * + * Test CenteringRing is well defined. + * + * Test calling setters on CenteringRing will clear the ComponentPreset. + * + */ +public class CenteringRingComponentTests extends BaseTestCase { + + ComponentPreset preset; + + @Before + public void createPreset() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + preset = ComponentPresetFactory.create(presetspec); + } + + @Test + public void testComponentType() { + CenteringRing cr = new CenteringRing(); + + assertSame( ComponentPreset.Type.CENTERING_RING, cr.getPresetType() ); + } + + @Test + public void testLoadFromPresetIsSane() { + CenteringRing cr = new CenteringRing(); + + cr.loadPreset(preset); + + assertEquals( 2.0, cr.getLength(), 0.0 ); + assertEquals( 1.0, cr.getOuterRadius(), 0.0 ); + assertEquals( 0.5, cr.getInnerRadius(), 0.0 ); + + assertFalse( cr.isOuterRadiusAutomatic() ); + + assertSame( preset.get( ComponentPreset.MATERIAL), cr.getMaterial() ); + assertEquals( 100.0, cr.getMass(), 0.05); + } + + @Test + public void changeLengthLeavesPreset() { + CenteringRing cr = new CenteringRing(); + + cr.loadPreset(preset); + + cr.setLength(1.0); + + assertSame( preset, cr.getPresetComponent() ); + } + + @Test + public void changeODClearsPreset() { + CenteringRing cr = new CenteringRing(); + + cr.loadPreset(preset); + + cr.setOuterRadius(2.0); + + assertNull( cr.getPresetComponent() ); + } + + @Test + public void changeIDClearsPreset() { + CenteringRing cr = new CenteringRing(); + + cr.loadPreset(preset); + + cr.setInnerRadius(0.75); + + assertNull( cr.getPresetComponent() ); + } + + @Test + public void changeThicknessClearsPreset() { + CenteringRing cr = new CenteringRing(); + + cr.loadPreset(preset); + + cr.setThickness(0.1); + + assertNull( cr.getPresetComponent() ); + } + + @Test + public void changeMaterialClearsPreset() { + CenteringRing cr = new CenteringRing(); + + cr.loadPreset(preset); + + cr.setMaterial( new Material.Bulk("new", 1.0, true)); + + assertNull( cr.getPresetComponent() ); + } + +} diff --git a/core/test/net/sf/openrocket/preset/CenteringRingPresetTests.java b/core/test/net/sf/openrocket/preset/CenteringRingPresetTests.java new file mode 100644 index 00000000..c1ec240f --- /dev/null +++ b/core/test/net/sf/openrocket/preset/CenteringRingPresetTests.java @@ -0,0 +1,227 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; + +import org.junit.Test; + +/** + * Test construction of CENTERING_RING type ComponentPresets based on TypedPropertyMap through the + * ComponentPresetFactory.create() method. + * + * Ensure required properties are populated + * + * Ensure any computed values are correctly computed. + * + */ +public class CenteringRingPresetTests { + + @Test + public void testManufacturerRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Manufacturer specified")); + } + } + + @Test + public void testPartNoRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No PartNo specified")); + } + } + + @Test + public void testLengthRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Length specified")); + } + } + + @Test + public void testOnlyOuterDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testOnlyInnerDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testOnlyThicknessDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.THICKNESS, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testComputeInnerDiameter() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.THICKNESS, 0.5); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(1.0,preset.get(ComponentPreset.INNER_DIAMETER).doubleValue(),0.0); + } + + @Test + public void testComputeOuterDiameter() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.THICKNESS, 0.5); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(2.0,preset.get(ComponentPreset.OUTER_DIAMETER).doubleValue(),0.0); + } + + @Test + public void testComputeThickness() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(0.5,preset.get(ComponentPreset.THICKNESS).doubleValue(),0.0); + } + + @Test + public void testComputeThicknessLooses() throws Exception { + // If all OUTER_DIAMETER, INNER_DIAMETER and THICKNESS are + // specified, THICKNESS is recomputed. + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.THICKNESS, 15.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(0.5,preset.get(ComponentPreset.THICKNESS).doubleValue(),0.0); + } + + @Test + public void testComputeDensityNoMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // Compute the volume by hand here using a slightly different formula from + // the real implementation. The magic numbers are based on the + // constants put into the presetspec above. + double volume = /*outer area*/ (Math.PI * 1.0) - /* inner area */ (Math.PI * .25); + volume *= 2.0; /* times length */ + + double density = 100.0 / volume; + + assertEquals("CenteringRingCustom",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + } + + @Test + public void testMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(2.0,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + + } + + @Test + public void testComputeDensityWithMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.CENTERING_RING); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // Compute the volume by hand here using a slightly different formula from + // the real implementation. The magic numbers are based on the + // constants put into the presetspec above. + double volume = /*outer area*/ (Math.PI * 1.0) - /* inner area */ (Math.PI * .25); + volume *= 2.0; /* times length */ + + double density = 100.0 / volume; + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + } + +} diff --git a/core/test/net/sf/openrocket/preset/EngineBlockComponentTests.java b/core/test/net/sf/openrocket/preset/EngineBlockComponentTests.java new file mode 100644 index 00000000..6d69a8a3 --- /dev/null +++ b/core/test/net/sf/openrocket/preset/EngineBlockComponentTests.java @@ -0,0 +1,119 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.rocketcomponent.EngineBlock; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +import org.junit.Before; +import org.junit.Test; + +/** + * Test application of ComponentPresets to EngineBlock RocketComponents through + * the EngineBlock.loadFromPreset mechanism. + * + * Test EngineBlock is well defined. + * + * Test calling setters on EngineBlock will clear the ComponentPreset. + * + */ +public class EngineBlockComponentTests extends BaseTestCase { + + ComponentPreset preset; + + @Before + public void createPreset() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + preset = ComponentPresetFactory.create(presetspec); + } + + @Test + public void testComponentType() { + EngineBlock eb = new EngineBlock(); + + assertSame( ComponentPreset.Type.ENGINE_BLOCK, eb.getPresetType() ); + } + + @Test + public void testLoadFromPresetIsSane() { + EngineBlock eb = new EngineBlock(); + + eb.loadPreset(preset); + + assertEquals( 2.0, eb.getLength(), 0.0 ); + assertEquals( 1.0, eb.getOuterRadius(), 0.0 ); + assertEquals( 0.5, eb.getInnerRadius(), 0.0 ); + + assertFalse( eb.isOuterRadiusAutomatic() ); + + assertSame( preset.get( ComponentPreset.MATERIAL), eb.getMaterial() ); + assertEquals( 100.0, eb.getMass(), 0.05); + } + + @Test + public void changeLengthLeavesPreset() { + EngineBlock eb = new EngineBlock(); + + eb.loadPreset(preset); + + eb.setLength(1.0); + + assertSame( preset, eb.getPresetComponent() ); + } + + @Test + public void changeODClearsPreset() { + EngineBlock eb = new EngineBlock(); + + eb.loadPreset(preset); + + eb.setOuterRadius(2.0); + + assertNull( eb.getPresetComponent() ); + } + + @Test + public void changeIDClearsPreset() { + EngineBlock eb = new EngineBlock(); + + eb.loadPreset(preset); + + eb.setInnerRadius(0.75); + + assertNull( eb.getPresetComponent() ); + } + + @Test + public void changeThicknessClearsPreset() { + EngineBlock eb = new EngineBlock(); + + eb.loadPreset(preset); + + eb.setThickness(0.1); + + assertNull( eb.getPresetComponent() ); + } + + @Test + public void changeMaterialClearsPreset() { + EngineBlock eb = new EngineBlock(); + + eb.loadPreset(preset); + + eb.setMaterial( new Material.Bulk("new", 1.0, true)); + + assertNull( eb.getPresetComponent() ); + } + +} diff --git a/core/test/net/sf/openrocket/preset/EngineBlockPresetTests.java b/core/test/net/sf/openrocket/preset/EngineBlockPresetTests.java new file mode 100644 index 00000000..67971bc7 --- /dev/null +++ b/core/test/net/sf/openrocket/preset/EngineBlockPresetTests.java @@ -0,0 +1,227 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; + +import org.junit.Test; + +/** + * Test construction of ENGINE_BLOCK type ComponentPresets based on TypedPropertyMap through the + * ComponentPresetFactory.create() method. + * + * Ensure required properties are populated + * + * Ensure any computed values are correctly computed. + * + */ +public class EngineBlockPresetTests { + + @Test + public void testManufacturerRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Manufacturer specified")); + } + } + + @Test + public void testPartNoRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No PartNo specified")); + } + } + + @Test + public void testLengthRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Length specified")); + } + } + + @Test + public void testOnlyOuterDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testOnlyInnerDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testOnlyThicknessDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.THICKNESS, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testComputeInnerDiameter() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.THICKNESS, 0.5); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(1.0,preset.get(ComponentPreset.INNER_DIAMETER).doubleValue(),0.0); + } + + @Test + public void testComputeOuterDiameter() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.THICKNESS, 0.5); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(2.0,preset.get(ComponentPreset.OUTER_DIAMETER).doubleValue(),0.0); + } + + @Test + public void testComputeThickness() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(0.5,preset.get(ComponentPreset.THICKNESS).doubleValue(),0.0); + } + + @Test + public void testComputeThicknessLooses() throws Exception { + // If all OUTER_DIAMETER, INNER_DIAMETER and THICKNESS are + // specified, THICKNESS is recomputed. + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.THICKNESS, 15.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(0.5,preset.get(ComponentPreset.THICKNESS).doubleValue(),0.0); + } + + @Test + public void testComputeDensityNoMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // Compute the volume by hand here using a slightly different formula from + // the real implementation. The magic numbers are based on the + // constants put into the presetspec above. + double volume = /*outer area*/ (Math.PI * 1.0) - /* inner area */ (Math.PI * .25); + volume *= 2.0; /* times length */ + + double density = 100.0 / volume; + + assertEquals("EngineBlockCustom",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + } + + @Test + public void testMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(2.0,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + + } + + @Test + public void testComputeDensityWithMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.ENGINE_BLOCK); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // Compute the volume by hand here using a slightly different formula from + // the real implementation. The magic numbers are based on the + // constants put into the presetspec above. + double volume = /*outer area*/ (Math.PI * 1.0) - /* inner area */ (Math.PI * .25); + volume *= 2.0; /* times length */ + + double density = 100.0 / volume; + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + } + +} diff --git a/core/test/net/sf/openrocket/preset/NoseConeComponentTests.java b/core/test/net/sf/openrocket/preset/NoseConeComponentTests.java new file mode 100644 index 00000000..20c093ce --- /dev/null +++ b/core/test/net/sf/openrocket/preset/NoseConeComponentTests.java @@ -0,0 +1,173 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.*; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.rocketcomponent.NoseCone; +import net.sf.openrocket.rocketcomponent.Transition; +import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +import org.junit.Before; +import org.junit.Test; + +/** + * Test application of ComponentPresets to NoseCone RocketComponents through + * the NoseCone.loadFromPreset mechanism. + * + * Test NoseCone is well defined. + * + * Test calling setters on NoseCone will clear the ComponentPreset. + * + */ +public class NoseConeComponentTests extends BaseTestCase { + + ComponentPreset preset; + + @Before + public void createPreset() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + presetspec.put( ComponentPreset.AFT_OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.AFT_SHOULDER_LENGTH, 1.0); + presetspec.put( ComponentPreset.AFT_SHOULDER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.FILLED, true); + presetspec.put( ComponentPreset.MASS, 100.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + preset = ComponentPresetFactory.create(presetspec); + } + + @Test + public void testComponentType() { + NoseCone nc = new NoseCone(); + + assertSame( ComponentPreset.Type.NOSE_CONE, nc.getPresetType() ); + } + + @Test + public void testLoadFromPresetIsSane() { + NoseCone nc = new NoseCone(); + + nc.loadPreset(preset); + + assertEquals( 2.0, nc.getLength(), 0.0 ); + assertSame( Transition.Shape.CONICAL, nc.getType() ); + assertEquals( 1.0, nc.getAftRadius(), 0.0 ); + assertEquals( 0.0, nc.getForeShoulderLength(), 0.0 ); + assertEquals( 0.0, nc.getForeShoulderRadius(), 0.0 ); + assertEquals( 1.0, nc.getAftShoulderLength(), 0.0 ); + assertEquals( 0.5, nc.getAftShoulderRadius(), 0.0 ); + + assertFalse( nc.isForeRadiusAutomatic() ); + assertFalse( nc.isAftRadiusAutomatic() ); + assertTrue( nc.isFilled() ); + + assertSame( preset.get( ComponentPreset.MATERIAL), nc.getMaterial() ); + assertEquals( 100.0, nc.getMass(), 0.05); + } + + @Test + public void changeLengthClearsPreset() { + NoseCone nc = new NoseCone(); + + nc.loadPreset(preset); + + nc.setLength(1.0); + + assertNull( nc.getPresetComponent() ); + } + + @Test + public void changeAftRadiusClearsPreset() { + NoseCone nc = new NoseCone(); + + nc.loadPreset(preset); + + nc.setAftRadius(2.0); + + assertNull( nc.getPresetComponent() ); + } + + @Test + public void changeAftRadiusAutomaticClearsPreset() { + NoseCone nc = new NoseCone(); + + nc.loadPreset(preset); + + nc.setAftRadiusAutomatic(true); + + assertNull( nc.getPresetComponent() ); + } + + @Test + public void changeAftShoulderRadiusClearsPreset() { + NoseCone nc = new NoseCone(); + + nc.loadPreset(preset); + + nc.setAftShoulderRadius(2.0); + + assertNull( nc.getPresetComponent() ); + } + + @Test + public void changeAftSholderLengthLeavesPreset() { + NoseCone nc = new NoseCone(); + + nc.loadPreset(preset); + + nc.setAftShoulderLength(2.0); + + assertSame( preset, nc.getPresetComponent() ); + } + + @Test + public void changeThicknessClearsPreset() { + NoseCone nc = new NoseCone(); + + nc.loadPreset(preset); + + nc.setThickness(0.1); + + assertNull( nc.getPresetComponent() ); + } + + + @Test + public void changeFilledClearsPreset() { + NoseCone nc = new NoseCone(); + + nc.loadPreset(preset); + + nc.setFilled(false); + + assertNull( nc.getPresetComponent() ); + } + + @Test + public void changeMaterialClearsPreset() { + NoseCone nc = new NoseCone(); + + nc.loadPreset(preset); + + nc.setMaterial( new Material.Bulk("new", 1.0, true)); + + assertNull( nc.getPresetComponent() ); + } + + @Test + public void changeFinishLeavesPreset() { + NoseCone nc = new NoseCone(); + + nc.loadPreset(preset); + + nc.setFinish( Finish.POLISHED ); + + assertSame( preset, nc.getPresetComponent() ); + } + +} diff --git a/core/test/net/sf/openrocket/preset/NoseConePresetTests.java b/core/test/net/sf/openrocket/preset/NoseConePresetTests.java new file mode 100644 index 00000000..14832a28 --- /dev/null +++ b/core/test/net/sf/openrocket/preset/NoseConePresetTests.java @@ -0,0 +1,156 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.rocketcomponent.Transition; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +import org.junit.Test; + +/** + * Test construction of NOSE_CONE type ComponentPresets based on TypedPropertyMap through the + * ComponentPresetFactory.create() method. + * + * Ensure required properties are populated + * + * Ensure any computed values are correctly computed. + * + */ +public class NoseConePresetTests extends BaseTestCase { + + @Test + public void testManufacturerRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Manufacturer specified")); + } + } + + @Test + public void testPartNoRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No PartNo specified")); + } + } + + @Test + public void testLengthRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Length specified")); + } + } + + @Test + public void testShapeRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Shape")); + } + } + + @Test + public void testAftOuterDiameterRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No AftOuterDiameter")); + } + } + + @Test + public void testComputeDensityNoMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + presetspec.put( ComponentPreset.AFT_OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.FILLED, true); + presetspec.put( ComponentPreset.MASS, 100.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // constants put into the presetspec above. + double volume = /*base area*/ Math.PI; + volume *= 2.0 /* times height */ / 3.0; /* one third */ + + double density = 100.0 / volume; + + assertEquals("NoseConeCustom",preset.get(ComponentPreset.MATERIAL).getName()); + // FIXME - I would expect the nc volume computation to be closer for such a simple shape. + // simple math yields 47.74648 + // 100.0/nc.getComponentVolume yields 48.7159 + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),1.0); + } + + @Test + public void testMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + presetspec.put( ComponentPreset.AFT_OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(2.0,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + + } + + @Test + public void testComputeDensityWithMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + presetspec.put( ComponentPreset.AFT_OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.FILLED, true); + presetspec.put( ComponentPreset.MASS, 100.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // constants put into the presetspec above. + double volume = /*base area*/ Math.PI; + volume *= 2.0 /* times height */ / 3.0; /* one third */ + + double density = 100.0 / volume; + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + // FIXME - I would expect the nc volume computation to be closer for such a simple shape. + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),1.5); + } + +} diff --git a/core/test/net/sf/openrocket/preset/TransitionComponentTests.java b/core/test/net/sf/openrocket/preset/TransitionComponentTests.java new file mode 100644 index 00000000..f70c4fcc --- /dev/null +++ b/core/test/net/sf/openrocket/preset/TransitionComponentTests.java @@ -0,0 +1,213 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; +import net.sf.openrocket.rocketcomponent.Transition; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +import org.junit.Before; +import org.junit.Test; + +/** + * Test application of ComponentPresets to Transition RocketComponents through + * the Transition.loadFromPreset mechanism. + * + * Test Transition is well defined. + * + * Test calling setters on Transition will clear the ComponentPreset. + * + */ +public class TransitionComponentTests extends BaseTestCase { + + ComponentPreset preset; + + @Before + public void createPreset() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.NOSE_CONE); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + presetspec.put( ComponentPreset.AFT_OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.FORE_OUTER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.AFT_SHOULDER_LENGTH, 1.0); + presetspec.put( ComponentPreset.AFT_SHOULDER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.FORE_SHOULDER_LENGTH, 1.0); + presetspec.put( ComponentPreset.FORE_SHOULDER_DIAMETER, 0.5); + presetspec.put( ComponentPreset.FILLED, true); + presetspec.put( ComponentPreset.MASS, 100.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + preset = ComponentPresetFactory.create(presetspec); + } + + @Test + public void testComponentType() { + Transition tr = new Transition(); + + assertSame( ComponentPreset.Type.TRANSITION, tr.getPresetType() ); + } + + @Test + public void testLoadFromPresetIsSane() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + assertEquals( 2.0, tr.getLength(), 0.0 ); + assertSame( Transition.Shape.CONICAL, tr.getType() ); + assertEquals( 1.0, tr.getAftRadius(), 0.0 ); + assertEquals( 1.0, tr.getForeShoulderLength(), 0.0 ); + assertEquals( 0.25, tr.getForeShoulderRadius(), 0.0 ); + assertEquals( 1.0, tr.getAftShoulderLength(), 0.0 ); + assertEquals( 0.5, tr.getAftShoulderRadius(), 0.0 ); + + assertFalse( tr.isForeRadiusAutomatic() ); + assertFalse( tr.isAftRadiusAutomatic() ); + assertTrue( tr.isFilled() ); + + assertSame( preset.get( ComponentPreset.MATERIAL), tr.getMaterial() ); + // FIXME - WOW - off by 76g! tr.getMass returns 176.518 + //assertEquals( 100.0, tr.getMass()); + } + + @Test + public void changeLengthClearsPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setLength(1.0); + + assertNull( tr.getPresetComponent() ); + } + + @Test + public void changeAftRadiusClearsPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setAftRadius(2.0); + + assertNull( tr.getPresetComponent() ); + } + + @Test + public void changeAftRadiusAutomaticClearsPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setAftRadiusAutomatic(true); + + assertNull( tr.getPresetComponent() ); + } + + @Test + public void changeForeRadiusClearsPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setForeRadius(2.0); + + assertNull( tr.getPresetComponent() ); + } + + @Test + public void changeForeRadiusAutomaticClearsPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setForeRadiusAutomatic(true); + + assertNull( tr.getPresetComponent() ); + } + + @Test + public void changeForeShoulderRadiusClearsPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setForeShoulderRadius(2.0); + + assertNull( tr.getPresetComponent() ); + } + + @Test + public void changeAftShoulderRadiusClearsPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setAftShoulderRadius(2.0); + + assertNull( tr.getPresetComponent() ); + } + + @Test + public void changeAftSholderLengthLeavesPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setAftShoulderLength(2.0); + + assertSame( preset, tr.getPresetComponent() ); + } + + @Test + public void changeThicknessClearsPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setThickness(0.1); + + assertNull( tr.getPresetComponent() ); + } + + + @Test + public void changeFilledClearsPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setFilled(false); + + assertNull( tr.getPresetComponent() ); + } + + @Test + public void changeMaterialClearsPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setMaterial( new Material.Bulk("new", 1.0, true)); + + assertNull( tr.getPresetComponent() ); + } + + @Test + public void changeFinishLeavesPreset() { + Transition tr = new Transition(); + + tr.loadPreset(preset); + + tr.setFinish( Finish.POLISHED ); + + assertSame( preset, tr.getPresetComponent() ); + } + +} diff --git a/core/test/net/sf/openrocket/preset/TransitionPresetTests.java b/core/test/net/sf/openrocket/preset/TransitionPresetTests.java new file mode 100644 index 00000000..a3f636a7 --- /dev/null +++ b/core/test/net/sf/openrocket/preset/TransitionPresetTests.java @@ -0,0 +1,170 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.rocketcomponent.Transition; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +import org.junit.Test; + +/** + * Test construction of TRANSITION type ComponentPresets based on TypedPropertyMap through the + * ComponentPresetFactory.create() method. + * + * Ensure required properties are populated + * + * Ensure any computed values are correctly computed. + * + */ +public class TransitionPresetTests extends BaseTestCase { + + @Test + public void testManufacturerRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TRANSITION); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Manufacturer specified")); + } + } + + @Test + public void testPartNoRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TRANSITION); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No PartNo specified")); + } + } + + @Test + public void testLengthRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TRANSITION); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Length specified")); + } + } + + @Test + public void testAftOuterDiameterRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TRANSITION); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No AftOuterDiameter")); + } + } + + + @Test + public void testForeOuterDiameterRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TRANSITION); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + presetspec.put( ComponentPreset.AFT_OUTER_DIAMETER, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No ForeOuterDiameter")); + } + } + + @Test + public void testComputeDensityNoMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TRANSITION); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + presetspec.put( ComponentPreset.AFT_OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.FORE_OUTER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.FILLED, true); + presetspec.put( ComponentPreset.MASS, 100.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // constants put into the presetspec above. + double volume = /*base area*/ Math.PI * ( 1.0 * 1.0 + 1.0 * 0.5 + 0.5 * 0.5); + + volume *= 2.0 /* times height */ / 3.0; /* one third */ + + double density = 100.0 / volume; + + assertEquals("TransitionCustom",preset.get(ComponentPreset.MATERIAL).getName()); + // FIXME - I would expect the nc volume computation to be closer for such a simple shape. + // simple math yields 27.2837 + // 100/nc.getComponentVolume yields 27.59832 + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.5); + } + + @Test + public void testMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TRANSITION); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + presetspec.put( ComponentPreset.AFT_OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.FORE_OUTER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.FILLED, true); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(2.0,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + + } + + @Test + public void testComputeDensityWithMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TRANSITION); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.SHAPE, Transition.Shape.CONICAL); + presetspec.put( ComponentPreset.AFT_OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.FORE_OUTER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.FILLED, true); + presetspec.put( ComponentPreset.MASS, 100.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // constants put into the presetspec above. + double totvolume = /*base area*/ Math.PI; + + totvolume *= 4.0 /* times height */ / 3.0; /* one third */ + + double uppervolume = /*fore area*/ Math.PI * 0.5 * 0.5; + uppervolume *= 2.0 /* times height */ / 3.0; /* one third */ + + double volume = totvolume-uppervolume; + + double density = 100.0 / volume; + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + // FIXME - I would expect the nc volume computation to be closer for such a simple shape. + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),1.5); + } + +} diff --git a/core/test/net/sf/openrocket/preset/TubeCouplerComponentTests.java b/core/test/net/sf/openrocket/preset/TubeCouplerComponentTests.java new file mode 100644 index 00000000..b73d5e9a --- /dev/null +++ b/core/test/net/sf/openrocket/preset/TubeCouplerComponentTests.java @@ -0,0 +1,117 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.*; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.rocketcomponent.TubeCoupler; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +import org.junit.Before; +import org.junit.Test; + +/** + * Test application of ComponentPresets to TubeCoupler RocketComponents through + * the TubeCoupler.loadFromPreset mechanism. + * + * Test TubeCoupler is well defined. + * + * Test calling setters on TubeCoupler will clear the ComponentPreset. + * + */ +public class TubeCouplerComponentTests extends BaseTestCase { + + ComponentPreset preset; + + @Before + public void createPreset() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + preset = ComponentPresetFactory.create(presetspec); + } + + @Test + public void testComponentType() { + TubeCoupler tc = new TubeCoupler(); + + assertSame( ComponentPreset.Type.TUBE_COUPLER, tc.getPresetType() ); + } + + @Test + public void testLoadFromPresetIsSane() { + TubeCoupler tc = new TubeCoupler(); + + tc.loadPreset(preset); + + assertEquals( 2.0, tc.getLength(), 0.0 ); + assertEquals( 1.0, tc.getOuterRadius(), 0.0 ); + assertEquals( 0.5, tc.getInnerRadius(), 0.0 ); + + assertFalse( tc.isInnerRadiusAutomatic() ); + assertFalse( tc.isOuterRadiusAutomatic() ); + + assertSame( preset.get( ComponentPreset.MATERIAL), tc.getMaterial() ); + assertEquals( 100.0, tc.getMass(), 0.05); + } + + @Test + public void changeLengthLeavesPreset() { + TubeCoupler tc = new TubeCoupler(); + + tc.loadPreset(preset); + + tc.setLength(1.0); + + assertSame( preset, tc.getPresetComponent() ); + } + + @Test + public void changeODClearsPreset() { + TubeCoupler tc = new TubeCoupler(); + + tc.loadPreset(preset); + + tc.setOuterRadius(2.0); + + assertNull( tc.getPresetComponent() ); + } + + @Test + public void changeIDClearsPreset() { + TubeCoupler tc = new TubeCoupler(); + + tc.loadPreset(preset); + + tc.setInnerRadius(0.75); + + assertNull( tc.getPresetComponent() ); + } + + @Test + public void changeThicknessClearsPreset() { + TubeCoupler tc = new TubeCoupler(); + + tc.loadPreset(preset); + + tc.setThickness(0.1); + + assertNull( tc.getPresetComponent() ); + } + + @Test + public void changeMaterialClearsPreset() { + TubeCoupler tc = new TubeCoupler(); + + tc.loadPreset(preset); + + tc.setMaterial( new Material.Bulk("new", 1.0, true)); + + assertNull( tc.getPresetComponent() ); + } + +} diff --git a/core/test/net/sf/openrocket/preset/TubeCouplerPresetTests.java b/core/test/net/sf/openrocket/preset/TubeCouplerPresetTests.java new file mode 100644 index 00000000..754eee51 --- /dev/null +++ b/core/test/net/sf/openrocket/preset/TubeCouplerPresetTests.java @@ -0,0 +1,227 @@ +package net.sf.openrocket.preset; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; + +import org.junit.Test; + +/** + * Test construction of TUBE_COUPLER type ComponentPresets based on TypedPropertyMap through the + * ComponentPresetFactory.create() method. + * + * Ensure required properties are populated + * + * Ensure any computed values are correctly computed. + * + */ +public class TubeCouplerPresetTests { + + @Test + public void testManufacturerRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Manufacturer specified")); + } + } + + @Test + public void testPartNoRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No PartNo specified")); + } + } + + @Test + public void testLengthRequired() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("No Length specified")); + } + } + + @Test + public void testOnlyOuterDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testOnlyInnerDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testOnlyThicknessDiameter() { + try { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.THICKNESS, 2.0); + ComponentPresetFactory.create(presetspec); + } catch ( InvalidComponentPresetException ex ) { + assertTrue("Wrong Exception Thrown", ex.getMessage().contains("Preset underspecified")); + } + } + + @Test + public void testComputeInnerDiameter() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.THICKNESS, 0.5); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(1.0,preset.get(ComponentPreset.INNER_DIAMETER).doubleValue(),0.0); + } + + @Test + public void testComputeOuterDiameter() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.THICKNESS, 0.5); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(2.0,preset.get(ComponentPreset.OUTER_DIAMETER).doubleValue(),0.0); + } + + @Test + public void testComputeThickness() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(0.5,preset.get(ComponentPreset.THICKNESS).doubleValue(),0.0); + } + + @Test + public void testComputeThicknessLooses() throws Exception { + // If all OUTER_DIAMETER, INNER_DIAMETER and THICKNESS are + // specified, THICKNESS is recomputed. + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.THICKNESS, 15.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals(0.5,preset.get(ComponentPreset.THICKNESS).doubleValue(),0.0); + } + + @Test + public void testComputeDensityNoMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // Compute the volume by hand here using a slightly different formula from + // the real implementation. The magic numbers are based on the + // constants put into the presetspec above. + double volume = /*outer area*/ (Math.PI * 1.0) - /* inner area */ (Math.PI * .25); + volume *= 2.0; /* times length */ + + double density = 100.0 / volume; + + assertEquals("TubeCustom",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + } + + @Test + public void testMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(2.0,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + + } + + @Test + public void testComputeDensityWithMaterial() throws Exception { + TypedPropertyMap presetspec = new TypedPropertyMap(); + presetspec.put(ComponentPreset.TYPE, ComponentPreset.Type.TUBE_COUPLER); + presetspec.put( ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer("manufacturer")); + presetspec.put( ComponentPreset.PARTNO, "partno"); + presetspec.put( ComponentPreset.LENGTH, 2.0); + presetspec.put( ComponentPreset.OUTER_DIAMETER, 2.0); + presetspec.put( ComponentPreset.INNER_DIAMETER, 1.0); + presetspec.put( ComponentPreset.MASS, 100.0); + presetspec.put( ComponentPreset.MATERIAL, new Material.Bulk("test", 2.0, true)); + ComponentPreset preset = ComponentPresetFactory.create(presetspec); + + // Compute the volume by hand here using a slightly different formula from + // the real implementation. The magic numbers are based on the + // constants put into the presetspec above. + double volume = /*outer area*/ (Math.PI * 1.0) - /* inner area */ (Math.PI * .25); + volume *= 2.0; /* times length */ + + double density = 100.0 / volume; + + assertEquals("test",preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals(density,preset.get(ComponentPreset.MATERIAL).getDensity(),0.0005); + } + +}