Browse Source

Assert that path isn't invalid in get_level_for_path(_mut) and add tests

Isaac Woods 4 years ago
parent
commit
1a2521e411
1 changed files with 26 additions and 0 deletions
  1. 26 0
      aml/src/namespace.rs

+ 26 - 0
aml/src/namespace.rs

@@ -259,6 +259,8 @@ impl Namespace {
     }
 
     fn get_level_for_path(&self, path: &AmlName) -> Result<(&NamespaceLevel, NameSeg), AmlError> {
+        assert_ne!(*path, AmlName::root());
+
         let (last_seg, levels) = path.0[1..].split_last().unwrap();
         let last_seg = last_seg.as_segment().unwrap();
 
@@ -280,6 +282,8 @@ impl Namespace {
     /// Split an absolute path into a bunch of level segments (used to traverse the level data structure), and a
     /// last segment to index into that level. This must not be called on `\\`.
     fn get_level_for_path_mut(&mut self, path: &AmlName) -> Result<(&mut NamespaceLevel, NameSeg), AmlError> {
+        assert_ne!(*path, AmlName::root());
+
         let (last_seg, levels) = path.0[1..].split_last().unwrap();
         let last_seg = last_seg.as_segment().unwrap();
 
@@ -698,4 +702,26 @@ mod tests {
             assert_eq!(name, AmlName::from_str("\\FOO.BAR.A").unwrap());
         }
     }
+
+    #[test]
+    fn test_get_level_for_path() {
+        let mut namespace = Namespace::new();
+
+        // Add some scopes
+        assert_eq!(namespace.add_level(AmlName::from_str("\\FOO").unwrap(), LevelType::Scope), Ok(()));
+        assert_eq!(namespace.add_level(AmlName::from_str("\\FOO.BAR").unwrap(), LevelType::Scope), Ok(()));
+        assert_eq!(namespace.add_level(AmlName::from_str("\\FOO.BAR.BAZ").unwrap(), LevelType::Scope), Ok(()));
+        assert_eq!(namespace.add_level(AmlName::from_str("\\FOO.BAR.BAZ").unwrap(), LevelType::Scope), Ok(()));
+        assert_eq!(namespace.add_level(AmlName::from_str("\\FOO.BAR.BAZ.QUX").unwrap(), LevelType::Scope), Ok(()));
+
+        {
+            let (_, last_seg) =
+                namespace.get_level_for_path(&AmlName::from_str("\\FOO.BAR.BAZ").unwrap()).unwrap();
+            assert_eq!(last_seg, NameSeg::from_str("BAZ").unwrap());
+        }
+        {
+            let (_, last_seg) = namespace.get_level_for_path(&AmlName::from_str("\\FOO").unwrap()).unwrap();
+            assert_eq!(last_seg, NameSeg::from_str("FOO").unwrap());
+        }
+    }
 }