c052f273d0c4 — Floris Bruynooghe 2.0.2 6 years ago
Cover some more edge-cases

The high-level percentage interface should behave as expected and not
randomly fail because it's trying to write invalid values.
2 files changed, 43 insertions(+), 9 deletions(-)

M Cargo.toml
M src/lib.rs
M Cargo.toml +1 -1
@@ 1,6 1,6 @@ 
 [package]
 name = "bright"
-version = "2.0.1"
+version = "2.0.2"
 description = "Screen backlight control"
 homepage = "https://bitbucket.org/flub/bright"
 authors = ["Floris Bruynooghe <flub@devork.be>"]

          
M src/lib.rs +42 -8
@@ 94,8 94,11 @@ impl BacklightDevice {
     // Returns the new raw brightness.
     pub fn set(&self, n: u32) -> Result<u32, failure::Error> {
         let max = self.max_brightness()?;
-        let raw = max as f64 / 100.0 * n as f64;
-        self.set_brightness(raw.round() as u32)
+        let raw = match (max as f64 / 100.0 * n as f64).round() as u32 {
+            r if r <= max => r,
+            _ => max
+        };
+        self.set_brightness(raw)
     }
 
     // Increase brightness with percentage

          
@@ 103,7 106,11 @@ impl BacklightDevice {
         let max = self.max_brightness()?;
         let cur = self.get_brightness()?;
         let inc = (max as f64 / 100.0 * n as f64) as u32;
-        self.set_brightness(cur + inc)
+        let raw = match cur + inc {
+            r if r <= max => r,
+            _ => max
+        };
+        self.set_brightness(raw)
     }
 
     // Decrease brightness with percentage

          
@@ 111,7 118,11 @@ impl BacklightDevice {
         let max = self.max_brightness()?;
         let cur = self.get_brightness()?;
         let dec = (max as f64 / 100.0 * n as f64) as u32;
-        self.set_brightness(cur - dec)
+        let raw = match cur.checked_sub(dec) {
+            Some(r) => r,
+            None => 0,
+        };
+        self.set_brightness(raw)
     }
 }
 

          
@@ 204,21 215,44 @@ mod tests {
     }
 
     #[test]
+    fn set_105_pct() {
+        let dir = create_device(1222, 1234); // 99%
+        let dev = BacklightDevice::new(dir.path());
+        dev.set(105).unwrap();
+        assert_eq!(dev.get().unwrap(), 100);
+    }
+
+    #[test]
     fn incr() {
-        let dir = create_device(1234, 1234);
+        let dir = create_device(617, 1234); // 50%
         let dev = BacklightDevice::new(dir.path());
-        dev.set(50).unwrap();
+        assert_eq!(dev.get().unwrap(), 50);
         dev.incr(1).unwrap();
         assert_eq!(dev.get().unwrap(), 51);
     }
 
     #[test]
+    fn incr_gt_max() {
+        let dir = create_device(1222, 1234); // 99%
+        let dev = BacklightDevice::new(dir.path());
+        dev.incr(5).unwrap();
+        assert_eq!(dev.get().unwrap(), 100);
+    }
+
+    #[test]
     fn decr() {
-        let dir = create_device(1234, 1234);
+        let dir = create_device(617, 1234); // 50%
         let dev = BacklightDevice::new(dir.path());
-        dev.set(50).unwrap();
         dev.decr(1).unwrap();
         assert_eq!(dev.get().unwrap(), 49);
     }
 
+    #[test]
+    fn decr_lt_zero() {
+        let dir = create_device(12, 1234); // 1%
+        let dev = BacklightDevice::new(dir.path());
+        dev.decr(5).unwrap();
+        assert_eq!(dev.get().unwrap(), 0);
+    }
+
 }