Skip to content

Commit 9121c68

Browse files
authored
Merge pull request #99 from shepmaster/compile-fail
Automate compile failure tests
2 parents 4eb3ad1 + 1db9cb4 commit 9121c68

File tree

11 files changed

+130
-80
lines changed

11 files changed

+130
-80
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ jobs:
2626

2727
- run: cargo clippy -- -D warnings
2828

29+
- run: cd compatibility-tests/compile-fail && cargo test
30+
2931
secondary:
3032
runs-on: ubuntu-latest
3133
strategy:

Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ documentation = "https://docs.rs/sxd-document"
1515
license = "MIT"
1616

1717
[features]
18-
compile_failure = []
19-
2018
__internal_expose_string_pool = []
2119

2220
[dependencies]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "compile-fail"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
sxd-document = { path = "../..", features = ["__internal_expose_string_pool"] }
8+
9+
trybuild = "1.0"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#[test]
2+
fn ui() {
3+
let t = trybuild::TestCases::new();
4+
t.compile_fail("tests/ui/*.rs");
5+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
use sxd_document::__internal::StringPool;
2+
3+
fn string_cannot_outlive_the_pool() {
4+
let _s = {
5+
let pool = StringPool::new();
6+
pool.intern("hello")
7+
};
8+
}
9+
10+
fn main() {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
error[E0597]: `pool` does not live long enough
2+
--> tests/ui/string_pool.rs:6:9
3+
|
4+
4 | let _s = {
5+
| -- borrow later stored here
6+
5 | let pool = StringPool::new();
7+
| ---- binding `pool` declared here
8+
6 | pool.intern("hello")
9+
| ^^^^ borrowed value does not live long enough
10+
7 | };
11+
| - `pool` dropped here while still borrowed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use sxd_document::Package;
2+
3+
fn cannot_mutate_connections_while_iterating_over_root_children() {
4+
let package = Package::new();
5+
let (s, mut c) = package.as_thin_document();
6+
7+
let alpha = s.create_element("alpha");
8+
9+
for _ in c.root_children() {
10+
c.append_root_child(alpha);
11+
}
12+
}
13+
14+
fn cannot_mutate_connections_while_iterating_over_element_children() {
15+
let package = Package::new();
16+
let (s, mut c) = package.as_thin_document();
17+
18+
let alpha = s.create_element("alpha");
19+
let beta = s.create_element("beta");
20+
21+
for _ in c.element_children(alpha) {
22+
c.append_element_child(alpha, beta);
23+
}
24+
}
25+
26+
fn cannot_mutate_connections_while_iterating_over_siblings() {
27+
let package = Package::new();
28+
let (s, mut c) = package.as_thin_document();
29+
30+
let alpha = s.create_element("alpha");
31+
let beta = s.create_element("beta");
32+
33+
for _ in c.element_preceding_siblings(alpha) {
34+
c.append_element_child(alpha, beta);
35+
}
36+
}
37+
38+
fn nodes_cannot_live_outside_of_the_document() {
39+
let package = Package::new();
40+
41+
let _node = {
42+
let (s, _) = package.as_thin_document();
43+
44+
s.create_element("hello")
45+
};
46+
}
47+
48+
fn main() {}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
error[E0502]: cannot borrow `c` as mutable because it is also borrowed as immutable
2+
--> tests/ui/thindom.rs:10:9
3+
|
4+
9 | for _ in c.root_children() {
5+
| -----------------
6+
| |
7+
| immutable borrow occurs here
8+
| immutable borrow later used here
9+
10 | c.append_root_child(alpha);
10+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here
11+
12+
error[E0502]: cannot borrow `c` as mutable because it is also borrowed as immutable
13+
--> tests/ui/thindom.rs:22:9
14+
|
15+
21 | for _ in c.element_children(alpha) {
16+
| -------------------------
17+
| |
18+
| immutable borrow occurs here
19+
| immutable borrow later used here
20+
22 | c.append_element_child(alpha, beta);
21+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here
22+
23+
error[E0502]: cannot borrow `c` as mutable because it is also borrowed as immutable
24+
--> tests/ui/thindom.rs:34:9
25+
|
26+
33 | for _ in c.element_preceding_siblings(alpha) {
27+
| -----------------------------------
28+
| |
29+
| immutable borrow occurs here
30+
| immutable borrow later used here
31+
34 | c.append_element_child(alpha, beta);
32+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here
33+
34+
error[E0597]: `s` does not live long enough
35+
--> tests/ui/thindom.rs:44:9
36+
|
37+
41 | let _node = {
38+
| ----- borrow later stored here
39+
42 | let (s, _) = package.as_thin_document();
40+
| - binding `s` declared here
41+
43 |
42+
44 | s.create_element("hello")
43+
| ^ borrowed value does not live long enough
44+
45 | };
45+
| - `s` dropped here while still borrowed

src/dom.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,16 +1616,4 @@ mod test {
16161616
let element = doc.root().children()[0].element().unwrap();
16171617
assert_qname_eq!(element.name(), "hello");
16181618
}
1619-
1620-
#[test]
1621-
#[cfg(feature = "compile_failure")]
1622-
fn nodes_cannot_live_outside_of_the_document() {
1623-
let package = Package::new();
1624-
1625-
let _ = {
1626-
let doc = package.as_document();
1627-
1628-
doc.create_element("hello")
1629-
};
1630-
}
16311619
}

src/string_pool.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -230,15 +230,6 @@ mod test {
230230
assert_eq!(interned1.as_bytes().as_ptr(), interned2.as_bytes().as_ptr());
231231
}
232232

233-
#[test]
234-
#[cfg(feature = "compile_failure")]
235-
fn string_cannot_outlive_the_pool() {
236-
let z = {
237-
let s = StringPool::new();
238-
s.intern("hello")
239-
};
240-
}
241-
242233
#[test]
243234
fn ignores_the_lifetime_of_the_input_string() {
244235
let s = StringPool::new();

0 commit comments

Comments
 (0)