Skip to content

Commit da7112b

Browse files
author
James O'Cull
committed
Added temperature. Reworked length tests. Bumped to v0.2.0 because of breaking change with length constants handling.
1 parent e9d7a56 commit da7112b

File tree

9 files changed

+311
-48
lines changed

9 files changed

+311
-48
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
[package]
22
name = "measurements"
3-
version = "0.1.0"
3+
version = "0.2.0"
44
authors = ["James O'Cull <[email protected]>"]
55
documentation = "https://jocull.github.io/rust-measurements/"
66
repository = "https://github.com/jocull/rust-measurements"
7-
description = "Handle metric and imperial measurements with ease!"
7+
description = "Handle metric, imperial, and other measurements with ease! Types: Length, Temperature"
88
license = "MIT"

src/length/consts.rs

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/length/mod.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
1-
pub mod consts;
21
mod traits;
3-
use self::consts::*;
2+
3+
// Constants, metric
4+
const METER_NANOMETER_FACTOR: f64 = 1000000000.0;
5+
const METER_MICROMETER_FACTOR: f64 = 1000000.0;
6+
const METER_MILLIMETER_FACTOR: f64 = 1000.0;
7+
const METER_CENTIMETER_FACTOR: f64 = 100.0;
8+
const METER_DECAMETER_FACTOR: f64 = 0.1;
9+
const METER_HECTOMETER_FACTOR: f64 = 0.01;
10+
const METER_KILOMETER_FACTOR: f64 = 0.001;
11+
12+
// Constants, imperial
13+
const METER_INCH_FACTOR: f64 = 39.3700787402;
14+
const METER_FEET_FACTOR: f64 = 3.28083989501;
15+
const METER_YARD_FACTOR: f64 = 1.09361329834;
16+
const METER_FURLONG_FACTOR: f64 = 0.0049709695379;
17+
const METER_MILE_FACTOR: f64 = 0.000621371192237;
418

519
/// The `Length` struct can be used to deal with lengths in a common way.
620
/// Common metric and imperial units are supported.

src/lib.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,18 @@ mod tests;
1616
1717
#[allow(dead_code)]
1818
pub mod length;
19+
20+
/// The `Temperature` struct can be used to deal with temperatures in a common way.
21+
///
22+
/// # Example
23+
///
24+
/// ```
25+
/// use measurements::temperature::Temperature;
26+
///
27+
/// let boiling_water = Temperature::from_celsius(100.0);
28+
/// let fahrenheit = boiling_water.as_fahrenheit();
29+
/// println!("Boiling water measures at {} degrees fahrenheit.", fahrenheit);
30+
/// ```
31+
32+
#[allow(dead_code)]
33+
pub mod temperature;

src/temperature/mod.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
mod traits;
2+
3+
/// The `Temperature` struct can be used to deal with temperatures in a common way.
4+
#[derive(Copy, Clone, Debug)]
5+
pub struct Temperature {
6+
kelvin: f64
7+
}
8+
9+
impl Temperature {
10+
pub fn from_kelvin(kelvin: f64) -> Temperature {
11+
Temperature { kelvin: kelvin }
12+
}
13+
14+
pub fn from_celsius(celsius: f64) -> Temperature {
15+
Self::from_kelvin(celsius + 273.15)
16+
}
17+
18+
pub fn from_fahrenheit(fahrenheit: f64) -> Temperature {
19+
Self::from_kelvin((fahrenheit - 32.0) / 1.8 + 273.15)
20+
}
21+
22+
pub fn from_rankine(rankine: f64) -> Temperature {
23+
Self::from_kelvin((rankine - 491.67) / 1.8 + 273.15)
24+
}
25+
26+
pub fn as_kelvin(&self) -> f64 {
27+
self.kelvin
28+
}
29+
30+
pub fn as_celsius(&self) -> f64 {
31+
self.kelvin - 273.15
32+
}
33+
34+
pub fn as_fahrenheit(&self) -> f64 {
35+
(self.kelvin - 273.15) * 1.8 + 32.0
36+
}
37+
38+
pub fn as_rankine(&self) -> f64 {
39+
(self.kelvin - 273.15) * 1.8 + 491.67
40+
}
41+
}

src/temperature/traits.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
use std::ops::{Add,Sub,Div,Mul};
2+
use std::cmp::{Eq, PartialEq};
3+
use std::cmp::{PartialOrd, Ordering};
4+
use super::Temperature;
5+
6+
impl Add for Temperature {
7+
type Output = Temperature;
8+
9+
fn add(self, rhs: Temperature) -> Temperature {
10+
Temperature::from_kelvin(self.kelvin + rhs.kelvin)
11+
}
12+
}
13+
14+
impl Sub for Temperature {
15+
type Output = Temperature;
16+
17+
fn sub(self, rhs: Temperature) -> Temperature {
18+
Temperature::from_kelvin(self.kelvin - rhs.kelvin)
19+
}
20+
}
21+
22+
impl Div for Temperature {
23+
type Output = Temperature;
24+
25+
fn div(self, rhs: Temperature) -> Temperature {
26+
Temperature::from_kelvin(self.kelvin / rhs.kelvin)
27+
}
28+
}
29+
30+
impl Mul for Temperature {
31+
type Output = Temperature;
32+
33+
fn mul(self, rhs: Temperature) -> Temperature {
34+
Temperature::from_kelvin(self.kelvin * rhs.kelvin)
35+
}
36+
}
37+
38+
impl Eq for Temperature { }
39+
impl PartialEq for Temperature {
40+
fn eq(&self, other: &Temperature) -> bool {
41+
self.kelvin == other.kelvin
42+
}
43+
}
44+
45+
impl PartialOrd for Temperature {
46+
fn partial_cmp(&self, other: &Temperature) -> Option<Ordering> {
47+
self.kelvin.partial_cmp(&other.kelvin)
48+
}
49+
}

src/tests/length_tests.rs

Lines changed: 95 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,150 @@
11
use length::*;
2-
use length::consts::*;
32
use super::{assert_almost_eq};
43

54
// Metric
65
#[test]
76
fn nanometers() {
8-
// Basic tests
9-
assert_almost_eq(Length::from_meters(1.0).as_nanometers(), METER_NANOMETER_FACTOR);
10-
assert_almost_eq(Length::from_nanometers(METER_NANOMETER_FACTOR).as_meters(), 1.0);
7+
let i1 = Length::from_meters(100.0);
8+
let r1 = i1.as_nanometers();
119

12-
// Floating-point precision tests
13-
assert_almost_eq(Length::from_nanometers(1.0).as_nanometers(), Length::from_nanometers(1.0).as_nanometers());
14-
assert_almost_eq(Length::from_nanometers(0.00025).as_nanometers(), Length::from_nanometers(0.00025).as_nanometers());
10+
let i2 = Length::from_nanometers(100.0);
11+
let r2 = i2.as_meters();
12+
13+
assert_almost_eq(r1, 100000000000.0);
14+
assert_almost_eq(r2, 1.0E-7);
1515
}
1616

1717
#[test]
1818
fn micrometers() {
19-
assert_almost_eq(Length::from_meters(1.0).as_micrometers(), METER_MICROMETER_FACTOR);
20-
assert_almost_eq(Length::from_micrometers(METER_MICROMETER_FACTOR).as_meters(), 1.0);
19+
let i1 = Length::from_meters(100.0);
20+
let r1 = i1.as_micrometers();
21+
22+
let i2 = Length::from_micrometers(100.0);
23+
let r2 = i2.as_meters();
24+
25+
assert_almost_eq(r1, 100000000.0);
26+
assert_almost_eq(r2, 0.0001);
2127
}
2228

2329
#[test]
2430
fn millimeters() {
25-
assert_almost_eq(Length::from_meters(1.0).as_millimeters(), METER_MILLIMETER_FACTOR);
26-
assert_almost_eq(Length::from_millimeters(METER_MILLIMETER_FACTOR).as_meters(), 1.0);
31+
let i1 = Length::from_meters(100.0);
32+
let r1 = i1.as_millimeters();
33+
34+
let i2 = Length::from_millimeters(100.0);
35+
let r2 = i2.as_meters();
36+
37+
assert_almost_eq(r1, 100000.0);
38+
assert_almost_eq(r2, 0.1);
2739
}
2840

2941
#[test]
3042
fn centimeters() {
31-
assert_almost_eq(Length::from_meters(1.0).as_centimeters(), METER_CENTIMETER_FACTOR);
32-
assert_almost_eq(Length::from_centimeters(METER_CENTIMETER_FACTOR).as_meters(), 1.0);
43+
let i1 = Length::from_meters(100.0);
44+
let r1 = i1.as_centimeters();
45+
46+
let i2 = Length::from_centimeters(100.0);
47+
let r2 = i2.as_meters();
48+
49+
assert_almost_eq(r1, 10000.0);
50+
assert_almost_eq(r2, 1.0);
3351
}
3452

3553
#[test]
3654
fn decameter() {
37-
assert_almost_eq(Length::from_meters(1.0).as_decameters(), METER_DECAMETER_FACTOR);
38-
assert_almost_eq(Length::from_decameters(METER_DECAMETER_FACTOR).as_meters(), 1.0);
55+
let i1 = Length::from_meters(100.0);
56+
let r1 = i1.as_decameters();
57+
58+
let i2 = Length::from_decameters(100.0);
59+
let r2 = i2.as_meters();
60+
61+
assert_almost_eq(r1, 10.0);
62+
assert_almost_eq(r2, 1000.0);
3963
}
4064

4165
#[test]
4266
fn hectometer() {
43-
assert_almost_eq(Length::from_meters(1.0).as_hectometer(), METER_HECTOMETER_FACTOR);
44-
assert_almost_eq(Length::from_hectometers(METER_HECTOMETER_FACTOR).as_meters(), 1.0);
67+
let i1 = Length::from_meters(100.0);
68+
let r1 = i1.as_hectometer();
69+
70+
let i2 = Length::from_hectometers(100.0);
71+
let r2 = i2.as_meters();
72+
73+
assert_almost_eq(r1, 1.0);
74+
assert_almost_eq(r2, 10000.0);
4575
}
4676

4777
#[test]
4878
fn kilometer() {
49-
assert_almost_eq(Length::from_meters(1.0).as_kilometers(), METER_KILOMETER_FACTOR);
50-
assert_almost_eq(Length::from_kilometers(METER_KILOMETER_FACTOR).as_meters(), 1.0);
79+
let i1 = Length::from_meters(100.0);
80+
let r1 = i1.as_kilometers();
81+
82+
let i2 = Length::from_kilometers(100.0);
83+
let r2 = i2.as_meters();
84+
85+
assert_almost_eq(r1, 0.1);
86+
assert_almost_eq(r2, 100000.0);
5187
}
5288

5389
// Imperial
5490
#[test]
5591
fn inches() {
56-
assert_almost_eq(Length::from_meters(1.0).as_inches(), METER_INCH_FACTOR);
57-
assert_almost_eq(Length::from_inches(METER_INCH_FACTOR).as_meters(), 1.0);
92+
let i1 = Length::from_meters(100.0);
93+
let r1 = i1.as_inches();
94+
95+
let i2 = Length::from_inches(100.0);
96+
let r2 = i2.as_meters();
97+
98+
assert_almost_eq(r1, 3937.00787402);
99+
assert_almost_eq(r2, 2.54);
58100
}
59101

60102
#[test]
61103
fn feet() {
62-
assert_almost_eq(Length::from_meters(1.0).as_feet(), METER_FEET_FACTOR);
63-
assert_almost_eq(Length::from_feet(METER_FEET_FACTOR).as_meters(), 1.0);
104+
let i1 = Length::from_meters(100.0);
105+
let r1 = i1.as_feet();
106+
107+
let i2 = Length::from_feet(100.0);
108+
let r2 = i2.as_meters();
109+
110+
assert_almost_eq(r1, 328.083989501);
111+
assert_almost_eq(r2, 30.48);
64112
}
65113

66114
#[test]
67115
fn yards() {
68-
assert_almost_eq(Length::from_meters(1.0).as_yards(), METER_YARD_FACTOR);
69-
assert_almost_eq(Length::from_yards(METER_YARD_FACTOR).as_meters(), 1.0);
116+
let i1 = Length::from_meters(100.0);
117+
let r1 = i1.as_yards();
118+
119+
let i2 = Length::from_yards(100.0);
120+
let r2 = i2.as_meters();
121+
122+
assert_almost_eq(r1, 109.361329834);
123+
assert_almost_eq(r2, 91.44);
70124
}
71125

72126
#[test]
73127
fn furlongs() {
74-
assert_almost_eq(Length::from_meters(1.0).as_furlongs(), METER_FURLONG_FACTOR);
75-
assert_almost_eq(Length::from_furlongs(METER_FURLONG_FACTOR).as_meters(), 1.0);
128+
let i1 = Length::from_meters(100.0);
129+
let r1 = i1.as_furlongs();
130+
131+
let i2 = Length::from_furlongs(100.0);
132+
let r2 = i2.as_meters();
133+
134+
assert_almost_eq(r1, 0.49709695379);
135+
assert_almost_eq(r2, 20116.8);
76136
}
77137

78138
#[test]
79139
fn miles() {
80-
assert_almost_eq(Length::from_meters(1.0).as_miles(), METER_MILE_FACTOR);
81-
assert_almost_eq(Length::from_miles(METER_MILE_FACTOR).as_meters(), 1.0);
140+
let i1 = Length::from_meters(100.0);
141+
let r1 = i1.as_miles();
142+
143+
let i2 = Length::from_miles(100.0);
144+
let r2 = i2.as_meters();
145+
146+
assert_almost_eq(r1, 0.0621371192237);
147+
assert_almost_eq(r2, 160934.4);
82148
}
83149

84150
// Traits

src/tests/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
mod length_tests;
2+
mod temperature_tests;
23

34
const DEFAULT_DELTA: f64 = 0.000001;
45

0 commit comments

Comments
 (0)