Skip to content

Commit 928433a

Browse files
committed
More updates.
Switch deca for deci (more common?) Added area tests. Fix for issue #1.
1 parent edb947e commit 928433a

File tree

6 files changed

+249
-28
lines changed

6 files changed

+249
-28
lines changed

src/area.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::measurement::*;
22
use super::length;
33

4-
const SQUARE_METER_ACRE_FACTOR: f64 = 4046.86;
4+
const SQUARE_METER_ACRE_FACTOR: f64 = 1.0 / 4046.86;
55

66
/// The `Area` struct can be used to deal with areas in a common way.
77
/// Common metric and imperial units are supported.
@@ -71,14 +71,14 @@ impl Area {
7171
Self::from_square_centimeters(square_centimetres)
7272
}
7373

74-
pub fn from_square_decameters(square_decameters: f64) -> Self {
74+
pub fn from_square_decimeters(square_decimeters: f64) -> Self {
7575
Self::from_square_meters(
76-
square_decameters / (length::METER_DECAMETER_FACTOR * length::METER_DECAMETER_FACTOR),
76+
square_decimeters / (length::METER_DECIMETER_FACTOR * length::METER_DECIMETER_FACTOR),
7777
)
7878
}
7979

80-
pub fn from_square_decametres(square_decametres: f64) -> Self {
81-
Self::from_square_decameters(square_decametres)
80+
pub fn from_square_decimetres(square_decimetres: f64) -> Self {
81+
Self::from_square_decimeters(square_decimetres)
8282
}
8383

8484
pub fn from_square_hectometers(square_hectometers: f64) -> Self {
@@ -175,12 +175,12 @@ impl Area {
175175
self.as_square_meters()
176176
}
177177

178-
pub fn as_square_decameters(&self) -> f64 {
179-
self.square_meters * (length::METER_DECAMETER_FACTOR * length::METER_DECAMETER_FACTOR)
178+
pub fn as_square_decimeters(&self) -> f64 {
179+
self.square_meters * (length::METER_DECIMETER_FACTOR * length::METER_DECIMETER_FACTOR)
180180
}
181181

182-
pub fn as_square_decametres(&self) -> f64 {
183-
self.as_square_decameters()
182+
pub fn as_square_decimetres(&self) -> f64 {
183+
self.as_square_decimeters()
184184
}
185185

186186
pub fn as_square_hectometers(&self) -> f64 {

src/length.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ pub const METER_NANOMETER_FACTOR: f64 = 1000000000.0;
55
pub const METER_MICROMETER_FACTOR: f64 = 1000000.0;
66
pub const METER_MILLIMETER_FACTOR: f64 = 1000.0;
77
pub const METER_CENTIMETER_FACTOR: f64 = 100.0;
8-
pub const METER_DECAMETER_FACTOR: f64 = 0.1;
8+
pub const METER_DECIMETER_FACTOR: f64 = 10.0;
99
pub const METER_HECTOMETER_FACTOR: f64 = 0.01;
1010
pub const METER_KILOMETER_FACTOR: f64 = 0.001;
1111

@@ -76,12 +76,12 @@ impl Length {
7676
Self::from_centimeters(centimeters)
7777
}
7878

79-
pub fn from_decameters(decameters: f64) -> Self {
80-
Self::from_meters(decameters / METER_DECAMETER_FACTOR)
79+
pub fn from_decimeters(decimeters: f64) -> Self {
80+
Self::from_meters(decimeters / METER_DECIMETER_FACTOR)
8181
}
8282

83-
pub fn from_decametres(decameters: f64) -> Self {
84-
Self::from_decameters(decameters)
83+
pub fn from_decimetres(decimeters: f64) -> Self {
84+
Self::from_decimeters(decimeters)
8585
}
8686

8787
pub fn from_hectometers(hectometers: f64) -> Self {
@@ -162,12 +162,12 @@ impl Length {
162162
self.as_meters()
163163
}
164164

165-
pub fn as_decameters(&self) -> f64 {
166-
self.meters * METER_DECAMETER_FACTOR
165+
pub fn as_decimeters(&self) -> f64 {
166+
self.meters * METER_DECIMETER_FACTOR
167167
}
168168

169-
pub fn as_decametres(&self) -> f64 {
170-
self.as_decameters()
169+
pub fn as_decimetres(&self) -> f64 {
170+
self.as_decimeters()
171171
}
172172

173173
pub fn as_hectometers(&self) -> f64 {

src/measurement.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,9 @@ macro_rules! implement_display {
6969

7070
impl ::std::fmt::Display for $t {
7171
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
72-
let p = f.precision().unwrap_or(1);
73-
let w = f.width().unwrap_or(0);
7472
let (unit, value) = self.get_appropriate_units();
75-
write!(f, "{value:width$.prec$}\u{00A0}{unit}",
76-
prec=p, width=w, value=value, unit=unit)
73+
value.fmt(f)?;
74+
write!(f, "\u{00A0}{0}", unit)
7775
}
7876
}
7977
)*)

src/tests/area_tests.rs

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
use area::*;
2+
use super::assert_almost_eq;
3+
4+
#[test]
5+
fn square_meters() {
6+
let i1 = Area::from_square_meters(100.0);
7+
let r1 = i1.as_square_meters();
8+
let i2 = Area::from_square_meters(100.0);
9+
let r2 = i2.as_square_meters();
10+
assert_almost_eq(r1, 100.0);
11+
assert_almost_eq(r2, 100.0);
12+
}
13+
14+
#[test]
15+
fn square_metres() {
16+
let i1 = Area::from_square_meters(100.0);
17+
let r1 = i1.as_square_metres();
18+
let i2 = Area::from_square_metres(100.0);
19+
let r2 = i2.as_square_meters();
20+
assert_almost_eq(r1, 100.0);
21+
assert_almost_eq(r2, 100.0);
22+
}
23+
24+
#[test]
25+
fn square_nanometers() {
26+
let i1 = Area::from_square_meters(100.0);
27+
let r1 = i1.as_square_nanometers();
28+
let i2 = Area::from_square_nanometers(100.0);
29+
let r2 = i2.as_square_meters();
30+
assert_almost_eq(r1, 1e20);
31+
assert_almost_eq(r2, 1e-16);
32+
}
33+
34+
#[test]
35+
fn square_nanometres() {
36+
let i1 = Area::from_square_meters(100.0);
37+
let r1 = i1.as_square_nanometres();
38+
let i2 = Area::from_square_nanometres(100.0);
39+
let r2 = i2.as_square_meters();
40+
assert_almost_eq(r1, 1e20);
41+
assert_almost_eq(r2, 1e-16);
42+
}
43+
44+
#[test]
45+
fn square_micrometers() {
46+
let i1 = Area::from_square_meters(100.0);
47+
let r1 = i1.as_square_micrometers();
48+
let i2 = Area::from_square_micrometers(100.0);
49+
let r2 = i2.as_square_meters();
50+
assert_almost_eq(r1, 1e14);
51+
assert_almost_eq(r2, 1e-10);
52+
}
53+
54+
#[test]
55+
fn square_micrometres() {
56+
let i1 = Area::from_square_meters(100.0);
57+
let r1 = i1.as_square_micrometres();
58+
let i2 = Area::from_square_micrometres(100.0);
59+
let r2 = i2.as_square_meters();
60+
assert_almost_eq(r1, 1e14);
61+
assert_almost_eq(r2, 1e-10);
62+
}
63+
64+
#[test]
65+
fn square_millimeters() {
66+
let i1 = Area::from_square_meters(100.0);
67+
let r1 = i1.as_square_millimeters();
68+
let i2 = Area::from_square_millimeters(100.0);
69+
let r2 = i2.as_square_meters();
70+
assert_almost_eq(r1, 1e8);
71+
assert_almost_eq(r2, 1e-4);
72+
}
73+
74+
#[test]
75+
fn square_millimetres() {
76+
let i1 = Area::from_square_meters(100.0);
77+
let r1 = i1.as_square_millimetres();
78+
let i2 = Area::from_square_millimetres(100.0);
79+
let r2 = i2.as_square_meters();
80+
assert_almost_eq(r1, 1e8);
81+
assert_almost_eq(r2, 1e-4);
82+
}
83+
84+
#[test]
85+
fn square_centimeters() {
86+
let i1 = Area::from_square_meters(100.0);
87+
let r1 = i1.as_square_centimeters();
88+
let i2 = Area::from_square_centimeters(100.0);
89+
let r2 = i2.as_square_meters();
90+
assert_almost_eq(r1, 1e6);
91+
assert_almost_eq(r2, 1e-2);
92+
}
93+
94+
#[test]
95+
fn square_centimetres() {
96+
let i1 = Area::from_square_meters(100.0);
97+
let r1 = i1.as_square_centimetres();
98+
let i2 = Area::from_square_centimetres(100.0);
99+
let r2 = i2.as_square_meters();
100+
assert_almost_eq(r1, 1e6);
101+
assert_almost_eq(r2, 1e-2);
102+
}
103+
104+
#[test]
105+
fn square_decimeters() {
106+
let i1 = Area::from_square_meters(100.0);
107+
let r1 = i1.as_square_decimeters();
108+
let i2 = Area::from_square_decimeters(100.0);
109+
let r2 = i2.as_square_meters();
110+
assert_almost_eq(r1, 1e4);
111+
assert_almost_eq(r2, 1.0);
112+
}
113+
114+
#[test]
115+
fn square_decimetres() {
116+
let i1 = Area::from_square_meters(100.0);
117+
let r1 = i1.as_square_decimetres();
118+
let i2 = Area::from_square_decimetres(100.0);
119+
let r2 = i2.as_square_meters();
120+
assert_almost_eq(r1, 1e4);
121+
assert_almost_eq(r2, 1.0);
122+
}
123+
124+
#[test]
125+
fn square_hectometers() {
126+
let i1 = Area::from_square_meters(100.0);
127+
let r1 = i1.as_square_hectometers();
128+
let i2 = Area::from_square_hectometers(100.0);
129+
let r2 = i2.as_square_meters();
130+
assert_almost_eq(r1, 1e-2);
131+
assert_almost_eq(r2, 1e6);
132+
}
133+
134+
#[test]
135+
fn square_hectometres() {
136+
let i1 = Area::from_square_meters(100.0);
137+
let r1 = i1.as_square_hectometres();
138+
let i2 = Area::from_square_hectometres(100.0);
139+
let r2 = i2.as_square_meters();
140+
assert_almost_eq(r1, 1e-2);
141+
assert_almost_eq(r2, 1e6);
142+
}
143+
144+
#[test]
145+
fn hectares() {
146+
let i1 = Area::from_square_meters(100.0);
147+
let r1 = i1.as_hectares();
148+
let i2 = Area::from_hectares(100.0);
149+
let r2 = i2.as_square_meters();
150+
assert_almost_eq(r1, 1e-2);
151+
assert_almost_eq(r2, 1e6);
152+
}
153+
154+
#[test]
155+
fn square_kilometers() {
156+
let i1 = Area::from_square_meters(100.0);
157+
let r1 = i1.as_square_kilometers();
158+
let i2 = Area::from_square_kilometers(100.0);
159+
let r2 = i2.as_square_meters();
160+
assert_almost_eq(r1, 1e-4);
161+
assert_almost_eq(r2, 1e8);
162+
}
163+
164+
#[test]
165+
fn square_kilometres() {
166+
let i1 = Area::from_square_meters(100.0);
167+
let r1 = i1.as_square_kilometres();
168+
let i2 = Area::from_square_kilometres(100.0);
169+
let r2 = i2.as_square_meters();
170+
assert_almost_eq(r1, 1e-4);
171+
assert_almost_eq(r2, 1e8);
172+
}
173+
174+
#[test]
175+
fn square_inches() {
176+
let i1 = Area::from_square_meters(100.0);
177+
let r1 = i1.as_square_inches();
178+
let i2 = Area::from_square_inches(100.0);
179+
let r2 = i2.as_square_meters();
180+
assert_almost_eq(r1, 155000.0);
181+
assert_almost_eq(r2, 0.06451587097);
182+
}
183+
184+
#[test]
185+
fn square_feet() {
186+
let i1 = Area::from_square_meters(100.0);
187+
let r1 = i1.as_square_feet();
188+
let i2 = Area::from_square_feet(100.0);
189+
let r2 = i2.as_square_meters();
190+
assert_almost_eq(r1, 1076.39);
191+
assert_almost_eq(r2, 9.2902950097728);
192+
}
193+
194+
#[test]
195+
fn square_yards() {
196+
let i1 = Area::from_square_meters(100.0);
197+
let r1 = i1.as_square_yards();
198+
let i2 = Area::from_square_yards(100.0);
199+
let r2 = i2.as_square_meters();
200+
assert_almost_eq(r1, 119.599);
201+
assert_almost_eq(r2, 83.612732764187);
202+
}
203+
204+
#[test]
205+
fn acres() {
206+
let i1 = Area::from_square_meters(100.0);
207+
let r1 = i1.as_acres();
208+
let i2 = Area::from_acres(100.0);
209+
let r2 = i2.as_square_meters();
210+
assert_almost_eq(r1, 0.0247105);
211+
assert_almost_eq(r2, 404686.0);
212+
}
213+
214+
#[test]
215+
fn square_miles() {
216+
let i1 = Area::from_square_meters(100.0);
217+
let r1 = i1.as_square_miles();
218+
let i2 = Area::from_square_miles(100.0);
219+
let r2 = i2.as_square_meters();
220+
assert_almost_eq(r1, 3.86102e-5);
221+
assert_almost_eq(r2, 258998704.7);
222+
}

src/tests/length_tests.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ fn centimeters() {
5151
}
5252

5353
#[test]
54-
fn decameter() {
54+
fn decimeter() {
5555
let i1 = Length::from_meters(100.0);
56-
let r1 = i1.as_decameters();
56+
let r1 = i1.as_decimeters();
5757

58-
let i2 = Length::from_decameters(100.0);
58+
let i2 = Length::from_decimeters(100.0);
5959
let r2 = i2.as_meters();
6060

61-
assert_almost_eq(r1, 10.0);
62-
assert_almost_eq(r2, 1000.0);
61+
assert_almost_eq(r1, 1000.0);
62+
assert_almost_eq(r2, 10.0);
6363
}
6464

6565
#[test]

src/tests/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ mod speed_tests;
66
mod acceleration_tests;
77
mod energy_tests;
88
mod power_tests;
9+
mod area_tests;
910

1011
const DEFAULT_DELTA: f64 = 0.00001;
1112

@@ -14,7 +15,7 @@ fn almost_eq(a: f64, b: f64) -> bool {
1415
}
1516

1617
fn almost_eq_delta(a: f64, b: f64, d: f64) -> bool {
17-
(a - b).abs() < d
18+
((a - b).abs() / a) < d
1819
}
1920

2021
fn assert_almost_eq(a: f64, b: f64) {

0 commit comments

Comments
 (0)