Skip to content

Commit 215a805

Browse files
author
Gameldar
committed
Add a test after parsing a route to ensure it doesn't contain duplicate parameter names
1 parent b803c93 commit 215a805

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

src/lib.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
1+
<<<<<<< HEAD
12
use std::{
23
cmp::Ordering,
34
collections::{btree_map, BTreeMap},
45
ops::Index,
56
};
67

78
use crate::nfa::{CharacterClass, NFA};
9+
=======
10+
use nfa::CharacterClass;
11+
use nfa::NFA;
12+
use std::cmp::Ordering;
13+
use std::collections::btree_map;
14+
use std::collections::BTreeMap;
15+
use std::collections::HashSet;
16+
use std::ops::Index;
17+
>>>>>>> Add a test after parsing a route to ensure it doesn't contain duplicate parameter names
818

919
pub mod nfa;
1020

@@ -174,6 +184,12 @@ impl<T> Router<T> {
174184
metadata.statics += 1;
175185
}
176186
}
187+
let mut hashes = HashSet::new();
188+
for name in metadata.param_names.iter() {
189+
if !hashes.insert(name.to_string()) {
190+
panic!("Duplicate name '{}' in route {}", name.to_string(), &route);
191+
}
192+
}
177193

178194
nfa.acceptance(state);
179195
nfa.metadata(state, metadata);
@@ -360,6 +376,7 @@ mod tests {
360376
router.add("/a/*b/c", "abc".to_string());
361377
router.add("/a/*b/c/:d", "abcd".to_string());
362378

379+
<<<<<<< HEAD
363380
let m = router.recognize("/a/foo").unwrap();
364381
assert_eq!(*m.handler, "ab".to_string());
365382
assert_eq!(m.params, params("b", "foo"));
@@ -379,6 +396,49 @@ mod tests {
379396
let m = router.recognize("/a/foo/c/baz").unwrap();
380397
assert_eq!(*m.handler, "abcd".to_string());
381398
assert_eq!(m.params, two_params("b", "foo", "d", "baz"));
399+
=======
400+
#[test]
401+
#[should_panic]
402+
fn duplicate_named_parameter() {
403+
let mut router = Router::new();
404+
router.add("/foo/:bar/:bar", "test".to_string());
405+
}
406+
407+
#[test]
408+
#[should_panic]
409+
fn duplicate_star_parameter() {
410+
let mut router = Router::new();
411+
router.add("/foo/*bar/*bar", "test".to_string());
412+
}
413+
414+
#[test]
415+
#[should_panic]
416+
fn duplicate_mixed_parameter() {
417+
let mut router = Router::new();
418+
router.add("/foo/*bar/:bar", "test".to_string());
419+
}
420+
421+
#[test]
422+
#[should_panic]
423+
fn duplicate_mixed_reversed_parameter() {
424+
let mut router = Router::new();
425+
router.add("/foo/:bar/*bar", "test".to_string());
426+
}
427+
428+
#[test]
429+
#[should_panic]
430+
fn duplicate_separated_parameter() {
431+
let mut router = Router::new();
432+
router.add("/foo/:bar/bleg/:bar", "test".to_string());
433+
}
434+
435+
#[allow(dead_code)]
436+
fn params(key: &str, val: &str) -> Params {
437+
let mut map = Params::new();
438+
map.insert(key.to_string(), val.to_string());
439+
map
440+
}
441+
>>>>>>> Add a test after parsing a route to ensure it doesn't contain duplicate parameter names
382442

383443
let m = router.recognize("/a/foo/bar/c/baz").unwrap();
384444
assert_eq!(*m.handler, "abcd".to_string());

0 commit comments

Comments
 (0)