Skip to content

Commit ab439c5

Browse files
committed
test: Add Origin unicode tests
1 parent 9ea63cd commit ab439c5

File tree

1 file changed

+265
-0
lines changed

1 file changed

+265
-0
lines changed

tests/rustc_tests.rs

Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3691,3 +3691,268 @@ LL | |   bar
36913691
let renderer = Renderer::plain().anonymized_line_numbers(true);
36923692
assert_data_eq!(renderer.render(input), expected.raw());
36933693
}
3694+
3695+
#[test]
3696+
fn origin_path_repeated() {
3697+
// tests/ui/pattern/usefulness/match-privately-empty.rs
3698+
let source = r#"//@ revisions: normal exhaustive_patterns
3699+
#![cfg_attr(exhaustive_patterns, feature(exhaustive_patterns))]
3700+
#![feature(never_type)]
3701+
3702+
mod private {
3703+
pub struct Private {
3704+
_bot: !,
3705+
pub misc: bool,
3706+
}
3707+
pub const DATA: Option<Private> = None;
3708+
}
3709+
3710+
fn main() {
3711+
match private::DATA {
3712+
//~^ ERROR non-exhaustive patterns: `Some(Private { misc: true, .. })` not covered
3713+
None => {}
3714+
Some(private::Private { misc: false, .. }) => {}
3715+
}
3716+
}
3717+
"#;
3718+
let title_0 = "non-exhaustive patterns: `Some(Private { misc: true, .. })` not covered";
3719+
let title_1 = "`Option<Private>` defined here";
3720+
let title_2 = "ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown";
3721+
3722+
let input = &[
3723+
Group::with_title(Level::ERROR.title(title_0).id("E0004")).element(
3724+
Snippet::source(source)
3725+
.path("$DIR/match-privately-empty.rs")
3726+
.annotation(
3727+
AnnotationKind::Primary
3728+
.span(286..299)
3729+
.label("pattern `Some(Private { misc: true, .. })` not covered"),
3730+
),
3731+
),
3732+
Group::with_title(Level::NOTE.title(title_1))
3733+
.element(
3734+
Origin::path("$SRC_DIR/core/src/option.rs")
3735+
.line(593)
3736+
.char_column(0)
3737+
.primary(true),
3738+
)
3739+
.element(
3740+
Origin::path("$SRC_DIR/core/src/option.rs")
3741+
.line(601)
3742+
.char_column(4),
3743+
)
3744+
.element(Padding)
3745+
.element(Level::NOTE.message("not covered"))
3746+
.element(Level::NOTE.message("the matched value is of type `Option<Private>`")),
3747+
Group::with_title(Level::HELP.title(title_2)).element(
3748+
Snippet::source(source)
3749+
.path("$DIR/match-privately-empty.rs")
3750+
.line_start(17)
3751+
.fold(true)
3752+
.patch(Patch::new(
3753+
468..468,
3754+
",
3755+
Some(Private { misc: true, .. }) => todo!()",
3756+
)),
3757+
),
3758+
];
3759+
let expected = str![[r#"
3760+
error[E0004]: non-exhaustive patterns: `Some(Private { misc: true, .. })` not covered
3761+
╭▸ $DIR/match-privately-empty.rs:14:11
3762+
3763+
LL │ match private::DATA {
3764+
│ ━━━━━━━━━━━━━ pattern `Some(Private { misc: true, .. })` not covered
3765+
╰╴
3766+
note: `Option<Private>` defined here
3767+
╭▸ $SRC_DIR/core/src/option.rs:593:0
3768+
⸬ $SRC_DIR/core/src/option.rs:601:4
3769+
3770+
├ note: not covered
3771+
╰ note: the matched value is of type `Option<Private>`
3772+
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
3773+
╭╴
3774+
LL ± Some(private::Private { misc: false, .. }) => {},
3775+
LL + Some(Private { misc: true, .. }) => todo!()
3776+
╰╴
3777+
"#]];
3778+
let renderer = Renderer::plain()
3779+
.anonymized_line_numbers(true)
3780+
.theme(OutputTheme::Unicode);
3781+
assert_data_eq!(renderer.render(input), expected);
3782+
}
3783+
3784+
#[test]
3785+
fn origin_path_repeated_element_between() {
3786+
// tests/ui/dyn-compatibility/bare-trait-dont-suggest-dyn.rs
3787+
let source = r#"//@ revisions: old new
3788+
//@[old] edition:2015
3789+
//@[new] edition:2021
3790+
//@[new] run-rustfix
3791+
#![deny(bare_trait_objects)]
3792+
fn ord_prefer_dot(s: String) -> Ord {
3793+
//[new]~^ ERROR expected a type, found a trait
3794+
//[old]~^^ ERROR the trait `Ord` is not dyn compatible
3795+
//[old]~| ERROR trait objects without an explicit `dyn` are deprecated
3796+
//[old]~| WARNING this is accepted in the current edition (Rust 2015)
3797+
(s.starts_with("."), s)
3798+
}
3799+
fn main() {
3800+
let _ = ord_prefer_dot(String::new());
3801+
}
3802+
"#;
3803+
let title_0 = "for a trait to be dyn compatible it needs to allow building a vtable
3804+
for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>";
3805+
3806+
let input = &[
3807+
Group::with_title(
3808+
Level::ERROR
3809+
.title("the trait `Ord` is not dyn compatible")
3810+
.id("E0038"),
3811+
)
3812+
.element(
3813+
Snippet::source(source)
3814+
.path("$DIR/bare-trait-dont-suggest-dyn.rs")
3815+
.annotation(
3816+
AnnotationKind::Primary
3817+
.span(149..152)
3818+
.label("`Ord` is not dyn compatible"),
3819+
),
3820+
),
3821+
Group::with_title(Level::NOTE.title(title_0))
3822+
.element(
3823+
Origin::path("$SRC_DIR/core/src/cmp.rs")
3824+
.line(961)
3825+
.char_column(20)
3826+
.primary(true),
3827+
)
3828+
.element(Padding)
3829+
.element(Level::NOTE.message(
3830+
"the trait is not dyn compatible because it uses `Self` as a type parameter",
3831+
))
3832+
.element(
3833+
Origin::path("$SRC_DIR/core/src/cmp.rs")
3834+
.line(338)
3835+
.char_column(14),
3836+
)
3837+
.element(Padding)
3838+
.element(Level::NOTE.message(
3839+
"the trait is not dyn compatible because it uses `Self` as a type parameter",
3840+
)),
3841+
Group::with_title(Level::HELP.title("consider using an opaque type instead")).element(
3842+
Snippet::source(source)
3843+
.path("$DIR/bare-trait-dont-suggest-dyn.rs")
3844+
.line_start(6)
3845+
.fold(true)
3846+
.patch(Patch::new(149..149, "impl ")),
3847+
),
3848+
];
3849+
let expected = str![[r#"
3850+
error[E0038]: the trait `Ord` is not dyn compatible
3851+
╭▸ $DIR/bare-trait-dont-suggest-dyn.rs:6:33
3852+
3853+
LL │ fn ord_prefer_dot(s: String) -> Ord {
3854+
│ ━━━ `Ord` is not dyn compatible
3855+
╰╴
3856+
note: for a trait to be dyn compatible it needs to allow building a vtable
3857+
for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
3858+
╭▸ $SRC_DIR/core/src/cmp.rs:961:20
3859+
3860+
╰ note: the trait is not dyn compatible because it uses `Self` as a type parameter
3861+
⸬ $SRC_DIR/core/src/cmp.rs:338:14
3862+
3863+
╰ note: the trait is not dyn compatible because it uses `Self` as a type parameter
3864+
help: consider using an opaque type instead
3865+
╭╴
3866+
LL │ fn ord_prefer_dot(s: String) -> impl Ord {
3867+
╰╴ ++++
3868+
"#]];
3869+
let renderer = Renderer::plain()
3870+
.anonymized_line_numbers(true)
3871+
.theme(OutputTheme::Unicode);
3872+
assert_data_eq!(renderer.render(input), expected);
3873+
}
3874+
3875+
#[test]
3876+
fn multiple_origin() {
3877+
// tests/ui/binop/binary-op-not-allowed-issue-125631.rs
3878+
let source_0 = r#"use std::io::{Error, ErrorKind};
3879+
use std::thread;
3880+
3881+
struct T1;
3882+
struct T2;
3883+
3884+
fn main() {
3885+
(Error::new(ErrorKind::Other, "1"), T1, 1) == (Error::new(ErrorKind::Other, "1"), T1, 2);
3886+
//~^ERROR binary operation `==` cannot be applied to type
3887+
(Error::new(ErrorKind::Other, "2"), thread::current())
3888+
== (Error::new(ErrorKind::Other, "2"), thread::current());
3889+
//~^ERROR binary operation `==` cannot be applied to type
3890+
(Error::new(ErrorKind::Other, "4"), thread::current(), T1, T2)
3891+
== (Error::new(ErrorKind::Other, "4"), thread::current(), T1, T2);
3892+
//~^ERROR binary operation `==` cannot be applied to type
3893+
}
3894+
"#;
3895+
let title_0 =
3896+
"the foreign item types don't implement required traits for this operation to be valid";
3897+
3898+
let input = &[
3899+
Group::with_title(
3900+
Level::ERROR
3901+
.title("binary operation `==` cannot be applied to type `(std::io::Error, Thread)`")
3902+
.id("E0369"),
3903+
)
3904+
.element(
3905+
Snippet::source(source_0)
3906+
.path("$DIR/binary-op-not-allowed-issue-125631.rs")
3907+
.annotation(
3908+
AnnotationKind::Context
3909+
.span(246..300)
3910+
.label("(std::io::Error, Thread)"),
3911+
)
3912+
.annotation(
3913+
AnnotationKind::Context
3914+
.span(312..366)
3915+
.label("(std::io::Error, Thread)"),
3916+
)
3917+
.annotation(AnnotationKind::Primary.span(309..311)),
3918+
),
3919+
Group::with_title(Level::NOTE.title(title_0))
3920+
.element(
3921+
Origin::path("$SRC_DIR/std/src/io/error.rs")
3922+
.line(65)
3923+
.char_column(0)
3924+
.primary(true),
3925+
)
3926+
.element(Padding)
3927+
.element(Level::NOTE.message("not implement `PartialEq`"))
3928+
.element(
3929+
Origin::path("$SRC_DIR/std/src/thread/mod.rs")
3930+
.line(1439)
3931+
.char_column(0)
3932+
.primary(true),
3933+
)
3934+
.element(Padding)
3935+
.element(Level::NOTE.message("not implement `PartialEq`")),
3936+
];
3937+
let expected = str![[r#"
3938+
error[E0369]: binary operation `==` cannot be applied to type `(std::io::Error, Thread)`
3939+
╭▸ $DIR/binary-op-not-allowed-issue-125631.rs:11:9
3940+
3941+
LL │ (Error::new(ErrorKind::Other, "2"), thread::current())
3942+
│ ────────────────────────────────────────────────────── (std::io::Error, Thread)
3943+
LL │ == (Error::new(ErrorKind::Other, "2"), thread::current());
3944+
│ ━━ ────────────────────────────────────────────────────── (std::io::Error, Thread)
3945+
╰╴
3946+
note: the foreign item types don't implement required traits for this operation to be valid
3947+
╭▸ $SRC_DIR/std/src/io/error.rs:65:0
3948+
3949+
╰ note: not implement `PartialEq`
3950+
╭▸ $SRC_DIR/std/src/thread/mod.rs:1439:0
3951+
3952+
╰ note: not implement `PartialEq`
3953+
"#]];
3954+
let renderer = Renderer::plain()
3955+
.anonymized_line_numbers(true)
3956+
.theme(OutputTheme::Unicode);
3957+
assert_data_eq!(renderer.render(input), expected);
3958+
}

0 commit comments

Comments
 (0)