driving_physics 0.0.0.2 → 0.0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/test/car.rb DELETED
@@ -1,156 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'driving_physics/car'
3
-
4
- C = DrivingPhysics::Car
5
-
6
- describe C do
7
- before do
8
- @env = DrivingPhysics::Environment.new
9
- @c = C.new(@env)
10
- end
11
-
12
- def get_moving
13
- @c.controls.brake_pedal = 0.0
14
- @c.controls.drive_pedal = 1.0
15
- @c.add_fuel 10
16
- 50.times { @c.tick! }
17
- expect(@c.condition.speed).must_be :>, 0.0
18
- end
19
-
20
-
21
- it "initializes" do
22
- expect(@c).must_be_instance_of C
23
- end
24
-
25
- it "has a string representation" do
26
- str = @c.to_s
27
- expect(str).must_be_instance_of String
28
- expect(str.length).must_be(:>, 5)
29
- end
30
-
31
- it "adds fuel and reports overflow" do
32
- expect(@c.condition.fuel).must_equal 0.0
33
- @c.add_fuel 10.0
34
- expect(@c.condition.fuel).must_equal 10.0
35
- overflow = @c.add_fuel @c.fuel_capacity
36
- expect(@c.condition.fuel).must_equal @c.fuel_capacity
37
- expect(overflow).must_equal 10.0
38
- end
39
-
40
- it "varies drive_force based on drive_pedal and available fuel" do
41
- expect(@c.drive_force).must_equal 0.0 # no pedal
42
- @c.controls.drive_pedal = 1.0
43
- expect(@c.drive_force).must_equal 0.0 # no fuel
44
- @c.add_fuel 10
45
-
46
- expect(@c.drive_force).must_equal @c.max_drive_force # vroom!
47
- end
48
-
49
- it "has a drive vector in direction of @dir" do
50
- @c.add_fuel 10
51
- @c.controls.drive_pedal = 1.0
52
- dv = @c.drive_force_vector
53
- expect(dv).must_be_instance_of Vector
54
- dvn = dv.normalize
55
- [0,1].each { |dim|
56
- expect(dvn[dim]).must_be_within_epsilon @c.condition.dir[dim]
57
- }
58
- end
59
-
60
- it "varies brake_force based on brake_pedal" do
61
- expect(@c.brake_force).must_equal 0.0 # no pedal
62
- @c.controls.brake_pedal = 1.0
63
- expect(@c.brake_force).must_equal @c.max_brake_force
64
- end
65
-
66
- it "has a brake vector opposing movement or @dir" do
67
- # hmm, no good way to go in reverse
68
- # just test against forward movement for now
69
- @c.controls.brake_pedal = 1.0
70
- bv = @c.brake_force_vector
71
- expect(bv).must_be_instance_of Vector
72
- bvn = bv.normalize
73
- [0,1].each { |dim|
74
- expect(bvn[dim]).must_be_within_epsilon @c.condition.dir[dim] * -1
75
- }
76
-
77
- get_moving
78
-
79
- @c.controls.drive_pedal = 0.0
80
- @c.controls.brake_pedal = 1.0
81
- bdir = @c.brake_force_vector.normalize
82
- vdir = @c.condition.vel.normalize
83
- [0,1].each { |dim|
84
- expect(bdir[dim]).must_be_within_epsilon vdir[dim] * -1
85
- }
86
- end
87
-
88
- it "tracks the mass of remaining fuel" do
89
- expect(@c.fuel_mass).must_equal 0.0
90
- @c.add_fuel 10
91
- expect(@c.fuel_mass).must_be_within_epsilon 7.1
92
- end
93
-
94
- it "tracks total_mass including fuel and driver" do
95
- expect(@c.total_mass).must_equal @c.mass + @c.driver_mass
96
- @c.add_fuel 10
97
- expect(@c.total_mass).must_equal @c.mass + @c.fuel_mass + @c.driver_mass
98
- end
99
-
100
- it "computes the total weight based on G" do
101
- expect(@c.weight).must_be_within_epsilon 10535.0
102
- end
103
-
104
- it "computes resistance forces based on instance variables" do
105
- air = @c.air_resistance
106
- expect(air).must_be_kind_of Vector
107
- expect(air.magnitude).must_equal 0.0
108
-
109
- rot = @c.rotational_resistance
110
- expect(rot).must_be_kind_of Vector
111
- expect(rot.magnitude).must_equal 0.0
112
-
113
- roll = @c.rolling_resistance
114
- expect(roll).must_be_kind_of Vector
115
- expect(roll.magnitude).must_be :>, 0
116
- end
117
-
118
- describe C::Condition do
119
- before do
120
- @cond = @c.condition
121
- end
122
-
123
- it "intializes" do
124
- expect(@cond).must_be_kind_of C::Condition
125
- end
126
-
127
- it "has a string representation" do
128
- str = @cond.to_s
129
- expect(str).must_be_kind_of String
130
- expect(str.length).must_be :>, 5
131
- end
132
-
133
- it "has a lateral direction clockwise from @dir" do
134
- lat = @cond.lat_dir
135
- expect(lat).must_be_kind_of Vector
136
- expect(lat.magnitude).must_be_within_epsilon 1.0
137
- expect(lat.independent?(@cond.dir)).must_equal true
138
- end
139
-
140
- it "has a movement_dir based on velocity, or @dir when stopped" do
141
- md = @cond.movement_dir
142
- expect(md).must_be_kind_of Vector
143
- expect(md.magnitude).must_be_within_epsilon 1.0
144
- expect(md).must_equal @cond.dir
145
-
146
- get_moving
147
- md = @cond.movement_dir
148
- expect(md).must_be_kind_of Vector
149
- expect(md.magnitude).must_be_within_epsilon 1.0
150
- vd = @cond.vel.normalize
151
- [0,1].each { |dim|
152
- expect(md[dim]).must_be_within_epsilon vd[dim]
153
- }
154
- end
155
- end
156
- end
data/test/wheel.rb DELETED
@@ -1,177 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'driving_physics/wheel'
3
-
4
- W = DrivingPhysics::Wheel
5
-
6
- describe W do
7
- describe "Wheel.traction" do
8
- it "calculates traction force from normal force and coeff of friction" do
9
- scalar_nf = 9800 # N
10
- cof = 1.1
11
- scalar_t = W.traction(scalar_nf, cof)
12
- expect(scalar_t).must_equal 10780.0
13
-
14
- vector_nf = Vector[9800, 0]
15
- vector_t = W.traction(vector_nf, cof)
16
- expect(vector_t).must_equal Vector[10780.0, 0.0]
17
- end
18
- end
19
-
20
- describe "Wheel.volume" do
21
- it "calculates the volume (m^3) of disk given radius and width" do
22
- cubic_m = W.volume(1.0, 1.0)
23
- expect(cubic_m).must_equal Math::PI
24
-
25
- cubic_m = W.volume(0.35, 0.2)
26
- expect(cubic_m).must_be_within_epsilon 0.076969
27
- end
28
- end
29
-
30
- describe "Wheel.volume_l" do
31
- it "calculates the volume (L) of a disk given radius and width" do
32
- liters = W.volume_l(1.0, 1.0)
33
- expect(liters).must_equal Math::PI * 1000
34
-
35
- liters = W.volume_l(0.35, 0.2)
36
- expect(liters).must_be_within_epsilon 76.96902
37
- end
38
- end
39
-
40
- describe "Wheel.density" do
41
- it "calculates the density (kg/L) given mass and volume" do
42
- expect(W.density(25.0, 25.0)).must_equal 1.0
43
- expect(W.density(50.0, 25.0)).must_equal 2.0
44
- end
45
- end
46
-
47
- describe "Wheel.mass" do
48
- it "calculates the mass (kg) of a disk given radius, width, and density" do
49
- expect(W.mass(0.35, 0.2, W::DENSITY)).must_be_within_epsilon 25.015
50
- end
51
- end
52
-
53
- describe "Wheel.rotational_inertia" do
54
- it "calculates rotational inertia for a disk given radius and mass" do
55
- expect(W.rotational_inertia(0.35, 25.0)).must_be_within_epsilon 1.53125
56
- end
57
- end
58
-
59
- describe "Wheel.alpha" do
60
- it "calculates angular acceleration from torque and inertia" do
61
- scalar_torque = 1000
62
- inertia = W.rotational_inertia(0.35, 25.0)
63
- expect(W.alpha scalar_torque, inertia).must_be_within_epsilon 653.061
64
-
65
- vector_torque = Vector[0, 0, 1000]
66
- vector_alpha = W.alpha vector_torque, inertia
67
- expect(vector_alpha).must_be_instance_of Vector
68
- expect(vector_alpha.size).must_equal 3
69
- expect(vector_alpha[2]).must_be_within_epsilon 653.06
70
- end
71
- end
72
-
73
- describe "Wheel.torque_vector" do
74
- it "calculates a torque in the 3rd dimension given 2D force and radius" do
75
- force = Vector[1000, 0]
76
- radius = Vector[0, 5]
77
- torque = W.torque_vector(force, radius)
78
- expect(torque).must_be_instance_of Vector
79
- expect(torque.size).must_equal 3
80
- expect(torque[2]).must_be_within_epsilon 5000.0
81
- end
82
- end
83
-
84
- describe "Wheel.force_vector" do
85
- it "calculates a (3D) force given 3D torque and 2D radius" do
86
- # let's invert the Wheel.torque_vector case from above:
87
- torque = Vector[0, 0, 5000]
88
- radius = Vector[0, 5]
89
- force = W.force_vector(torque, radius)
90
- expect(force).must_be_instance_of Vector
91
- expect(force.size).must_equal 3
92
- expect(force[0]).must_be_within_epsilon 1000.0
93
-
94
- # now let's rotate the radius into the x-dimension
95
- # right hand rule, positive torque means thumb into screen, clockwise
96
- # negative-x radius means positive-y force
97
- torque = Vector[0, 0, 500]
98
- radius = Vector[-5, 0]
99
- force = W.force_vector(torque, radius)
100
- expect(force).must_be_instance_of Vector
101
- expect(force.size).must_equal 3
102
- expect(force[1]).must_be_within_epsilon 100.0
103
- end
104
- end
105
-
106
- describe "instance methods" do
107
- before do
108
- @env = DrivingPhysics::Environment.new
109
- @w = W.new(@env)
110
- end
111
-
112
- it "initializes" do
113
- expect(@w).must_be_instance_of W
114
- expect(@w.density).must_equal W::DENSITY # sanity check
115
- expect(@w.mass).must_be_within_epsilon 25.01
116
-
117
- with_mass = W.new(@env, mass: 99.01)
118
- expect(with_mass.mass).must_equal 99.01
119
- expect(with_mass.density).wont_equal W::DENSITY
120
- end
121
-
122
- it "has a string representation" do
123
- str = @w.to_s
124
- expect(str).must_be_instance_of String
125
- expect(str.length).must_be(:>, 5)
126
- end
127
-
128
- it "loses radius as it wears" do
129
- expect(@w.radius).must_equal 350.0
130
- @w.wear!(50)
131
- expect(@w.radius).must_equal 300.0
132
- end
133
-
134
- it "calculates mass from current radius" do
135
- expect(@w.mass).must_be_within_epsilon 25.01
136
- @w.wear!(50)
137
- expect(@w.mass).must_be_within_epsilon 18.378
138
- end
139
-
140
- it "has volume" do
141
- expect(@w.volume).must_be_within_epsilon 0.07697
142
- expect(@w.volume_l).must_be_within_epsilon 76.96902
143
- end
144
-
145
- it "has inertia" do
146
- expect(@w.rotational_inertia).must_be_within_epsilon 1.5321
147
- end
148
-
149
- it "has traction force based on normal force" do
150
- scalar_nf = 9800
151
- expect(@w.traction scalar_nf).must_equal 10780.0
152
- expect(@w.traction scalar_nf, static: false).must_equal 6860.0
153
-
154
- vector_nf = Vector[9800, 0]
155
- expect(@w.traction vector_nf).must_equal Vector[10780.0, 0.0]
156
- expect(@w.traction vector_nf, static: false).
157
- must_equal Vector[6860.0, 0.0]
158
- end
159
-
160
- it "determines (e.g. thrust) force based on axle torque" do
161
- expect(@w.force 1000).must_be_within_epsilon 2857.143
162
- @w.wear! 50
163
- expect(@w.force 1000).must_be_within_epsilon 3333.333
164
- end
165
-
166
- it "determines tractable torque" do
167
- scalar_nf = 9800
168
- expect(@w.tractable_torque scalar_nf).must_be_within_epsilon 3773.0
169
- kin_tq = @w.tractable_torque scalar_nf, static: false
170
- expect(kin_tq).must_be_within_epsilon 2401.0
171
-
172
- # not sure about how torque vectors work, but the "math" "works":
173
- vector_nf = Vector[9800, 0]
174
- expect(@w.tractable_torque(vector_nf)[0]).must_be_within_epsilon 3773.0
175
- end
176
- end
177
- end