Skip to content

Commit 32c73d2

Browse files
author
Gameldar
committed
Add a test after parsing a route to ensure it doesn't contain duplicate parameter names
1 parent 61e3b07 commit 32c73d2

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/lib.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use nfa::NFA;
33
use std::cmp::Ordering;
44
use std::collections::btree_map;
55
use std::collections::BTreeMap;
6+
use std::collections::HashSet;
67
use std::ops::Index;
78

89
pub mod nfa;
@@ -173,6 +174,12 @@ impl<T> Router<T> {
173174
metadata.statics += 1;
174175
}
175176
}
177+
let mut hashes = HashSet::new();
178+
for name in metadata.param_names.iter() {
179+
if !hashes.insert(name.to_string()) {
180+
panic!("Duplicate name '{}' in route {}", name.to_string(), &route);
181+
}
182+
}
176183

177184
nfa.acceptance(state);
178185
nfa.metadata(state, metadata);
@@ -362,6 +369,41 @@ fn unnamed_parameters() {
362369
assert_eq!(m.params, params("bar", "test"));
363370
}
364371

372+
#[test]
373+
#[should_panic]
374+
fn duplicate_named_parameter() {
375+
let mut router = Router::new();
376+
router.add("/foo/:bar/:bar", "test".to_string());
377+
}
378+
379+
#[test]
380+
#[should_panic]
381+
fn duplicate_star_parameter() {
382+
let mut router = Router::new();
383+
router.add("/foo/*bar/*bar", "test".to_string());
384+
}
385+
386+
#[test]
387+
#[should_panic]
388+
fn duplicate_mixed_parameter() {
389+
let mut router = Router::new();
390+
router.add("/foo/*bar/:bar", "test".to_string());
391+
}
392+
393+
#[test]
394+
#[should_panic]
395+
fn duplicate_mixed_reversed_parameter() {
396+
let mut router = Router::new();
397+
router.add("/foo/:bar/*bar", "test".to_string());
398+
}
399+
400+
#[test]
401+
#[should_panic]
402+
fn duplicate_separated_parameter() {
403+
let mut router = Router::new();
404+
router.add("/foo/:bar/bleg/:bar", "test".to_string());
405+
}
406+
365407
#[allow(dead_code)]
366408
fn params(key: &str, val: &str) -> Params {
367409
let mut map = Params::new();

0 commit comments

Comments
 (0)