Skip to content

Commit f4800b5

Browse files
committed
Add tests for transit_model_procmacro
1 parent f16bd08 commit f4800b5

File tree

7 files changed

+139
-0
lines changed

7 files changed

+139
-0
lines changed

transit_model_procmacro/Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,22 @@ authors = ["Guillaume Pinot <[email protected]>"]
55
license = "AGPL-3.0-only"
66
description = "A private procmacro crate for the transit_model crate"
77
edition = "2018"
8+
autotests = false
89

910
[lib]
1011
proc-macro = true
1112

1213
[dependencies]
1314
syn = "0.11.11"
1415
quote = "0.3.15"
16+
17+
[dev-dependencies]
18+
pretty_assertions = "0.6"
19+
trybuild = "1"
20+
transit_model = { path = "../" }
21+
transit_model_collection = { path = "../collection" }
22+
transit_model_relations = { path = "../relations" }
23+
24+
[[test]]
25+
name = "tests"
26+
path = "tests/tests.rs"
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
use transit_model::objects::*;
2+
use transit_model_collection::*;
3+
use transit_model_procmacro::*;
4+
use transit_model_relations::*;
5+
6+
#[derive(GetCorresponding)]
7+
pub struct Model {
8+
lines_to_routes: OneToMany<Line, Route>,
9+
routes_to_vehicle_journeys: OneToMany<Route, VehicleJourney>,
10+
}
11+
12+
fn main() {
13+
let line = Line {
14+
id: String::from("line_id"),
15+
name: String::from("Line name"),
16+
..Default::default()
17+
};
18+
let route1 = Route {
19+
id: String::from("route_id_1"),
20+
name: String::from("Route Name 1"),
21+
line_id: String::from("line_id"),
22+
..Default::default()
23+
};
24+
let route2 = Route {
25+
id: String::from("route_id_2"),
26+
name: String::from("Route Name 2"),
27+
line_id: String::from("line_id"),
28+
..Default::default()
29+
};
30+
let vehicle_journey_1 = VehicleJourney {
31+
id: String::from("vehicle_journey_id_1"),
32+
route_id: String::from("route_id_1"),
33+
..Default::default()
34+
};
35+
let vehicle_journey_2 = VehicleJourney {
36+
id: String::from("vehicle_journey_id_2"),
37+
route_id: String::from("route_id_1"),
38+
..Default::default()
39+
};
40+
let vehicle_journey_3 = VehicleJourney {
41+
id: String::from("vehicle_journey_id_3"),
42+
route_id: String::from("route_id_2"),
43+
..Default::default()
44+
};
45+
let vehicle_journey_4 = VehicleJourney {
46+
id: String::from("vehicle_journey_id_4"),
47+
route_id: String::from("route_id_2"),
48+
..Default::default()
49+
};
50+
let lines = CollectionWithId::from(line);
51+
let routes = CollectionWithId::new(vec![route1, route2]).unwrap();
52+
let vehicle_journeys = CollectionWithId::new(vec![
53+
vehicle_journey_1,
54+
vehicle_journey_2,
55+
vehicle_journey_3,
56+
vehicle_journey_4,
57+
])
58+
.unwrap();
59+
let model = Model {
60+
lines_to_routes: OneToMany::new(&lines, &routes, "lines_to_routes").unwrap(),
61+
routes_to_vehicle_journeys: OneToMany::new(
62+
&routes,
63+
&vehicle_journeys,
64+
"routes_to_vehicle_journeys",
65+
)
66+
.unwrap(),
67+
};
68+
69+
let line_idx = lines.get_idx("line_id").unwrap();
70+
let vehicle_journey_indexes = model.get_corresponding_from_idx(line_idx);
71+
let vehicle_journey_1_idx = vehicle_journeys.get_idx("vehicle_journey_id_1").unwrap();
72+
assert!(vehicle_journey_indexes.contains(&vehicle_journey_1_idx));
73+
let vehicle_journey_2_idx = vehicle_journeys.get_idx("vehicle_journey_id_2").unwrap();
74+
assert!(vehicle_journey_indexes.contains(&vehicle_journey_2_idx));
75+
let vehicle_journey_3_idx = vehicle_journeys.get_idx("vehicle_journey_id_3").unwrap();
76+
assert!(vehicle_journey_indexes.contains(&vehicle_journey_3_idx));
77+
let vehicle_journey_4_idx = vehicle_journeys.get_idx("vehicle_journey_id_4").unwrap();
78+
assert!(vehicle_journey_indexes.contains(&vehicle_journey_4_idx));
79+
80+
let line_indexes = model.get_corresponding_from_idx(vehicle_journey_1_idx);
81+
assert!(line_indexes.contains(&line_idx));
82+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use transit_model::objects::*;
2+
use transit_model_collection::*;
3+
use transit_model_procmacro::*;
4+
use transit_model_relations::*;
5+
6+
#[derive(GetCorresponding)]
7+
pub struct Model {
8+
#[get_corresponding(weight = "abc")]
9+
lines_to_routes: OneToMany<Line, Route>,
10+
}
11+
12+
fn main() {}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
error: proc-macro derive panicked
2+
--> $DIR/02-invalid-weight.rs:6:10
3+
|
4+
6 | #[derive(GetCorresponding)]
5+
| ^^^^^^^^^^^^^^^^
6+
|
7+
= help: message: `weight` attribute must be convertible to f64: ParseFloatError { kind: Invalid }
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use transit_model::objects::*;
2+
use transit_model_collection::*;
3+
use transit_model_procmacro::*;
4+
use transit_model_relations::*;
5+
6+
#[derive(GetCorresponding)]
7+
pub struct Model {
8+
#[get_corresponding(nonsupportedargument)]
9+
lines_to_routes: OneToMany<Line, Route>,
10+
}
11+
12+
fn main() {}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
error: proc-macro derive panicked
2+
--> $DIR/03-non-supported-argument.rs:6:10
3+
|
4+
6 | #[derive(GetCorresponding)]
5+
| ^^^^^^^^^^^^^^^^
6+
|
7+
= help: message: Only `key = "value"` attributes supported.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#[test]
2+
fn compile_error() {
3+
let t = trybuild::TestCases::new();
4+
t.pass("tests/01-get-corresponding.rs");
5+
t.compile_fail("tests/02-invalid-weight.rs");
6+
t.compile_fail("tests/03-non-supported-argument.rs");
7+
}

0 commit comments

Comments
 (0)