рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЬреЙрди рд░реЗрдирд░ рдХреЗ рдмреНрд▓реЙрдЧ рдкрд░ "2018 рдореЗрдВ рдкреНрд░рд╡реЗрд╢" # [рдкрд░реАрдХреНрд╖рдг] рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЖрдкрдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ Rust рдХреЗ
рд▓рд┐рдП рдХрд╕реНрдЯрдо рдЯреЗрд╕реНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП
eRFC рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╕рдВрдХрд▓рдХ рдХреЗ рдХреЛрдб рдЖрдзрд╛рд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд░рд╕реНрдЯ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЖрдВрддрд░рд┐рдХ рдЕрдзреНрдпрдпрди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдФрд░ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред
рд╡рд┐рд╢реЗрд╖рддрд╛ # [рдкрд░реАрдХреНрд╖рдг]
рдЖрдЬ, рд░рд╕реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛
#[test]
рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ рдФрд░ рдХреБрдЫ рдЪреЗрдХ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ:
#[test] fn my_test() { assert!(2+2 == 4); }
рдЬрдм рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ
rustc --test
рдпрд╛
cargo test
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рджреЗрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдХреЛрдб рдХреЗ рдХрд░реАрдм рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рддреБрдо рднреА рдирд┐рдЬреА рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░ рдкрд░реАрдХреНрд╖рдг рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
mod my_priv_mod { fn my_priv_func() -> bool {} #[test] fn test_priv_func() { assert!(my_priv_func()); } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд┐рд╕реА рднреА рдмрд╛рд╣рд░реА рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдирд┐рдЬреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЬрдВрдЧ рдореЗрдВ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХреА рдХреБрдВрдЬреА рд╣реИред рд╢рдмреНрджрд╛рд░реНрде, рддрдерд╛рдкрд┐, рдпрд╣ рдмрд▓реНрдХрд┐ рдЕрдЬреАрдм рд╣реИред рдпрджрд┐ рд╡реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рддреЛ
main
рдлрд╝рдВрдХреНрд╢рди рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдХреИрд╕реЗ рдмреБрд▓рд╛рддрд╛ рд╣реИ (
рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯ : рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ, рдирд┐рдЬреА -
pub
рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдШреЛрд╖рд┐рдд - рдмрд╛рд╣рд░реА рдкрд╣реБрдВрдЪ рд╕реЗ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИрдВ)? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
rustc --test
рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?
#[test]
libsyntax рд╕рдВрдХрд▓рдХ
libsyntax
рдЕрдВрджрд░ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд░реВрдк
#[test]
рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдлреИрдВрд╕реА рдореИрдХреНрд░реЛ рд╣реИ рдЬреЛ 3 рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЯреЛрдХрд░реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ:
рдЪрд░рдг 1: рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдирд┐рдЬреА рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ
main
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП,
libsyntax
рд╕реНрдерд╛рдиреАрдп рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ __test_reexports
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ __test_reexports
: __test_reexports
рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ ред рдЗрд╕ рдкреНрд░рдХрдЯреАрдХрд░рдг рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
mod my_priv_mod { fn my_priv_func() -> bool {} fn test_priv_func() { assert!(my_priv_func()); } pub mod __test_reexports { pub use super::test_priv_func; } }
рдЕрдм рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг
my_priv_mod::__test_reexports::test_priv_func
рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдиреЗрд╕реНрдЯреЗрдб рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП,
__test_reexports
рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ
__test_reexports
рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг
a::b::my_test
a::__test_reexports::b::__test_reexports::my_test
ред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдм рддрдХ рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рд▓рдЧрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛
__test_reexports
рдореЙрдбреНрдпреВрд▓ рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдЙрддреНрддрд░:
рдХреБрдЫ рдирд╣реАрдВ ред
рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдХрд┐ рдПрдПрд╕рдЯреА рдХреИрд╕реЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ ред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо, рдЪрд░, рдореЙрдбреНрдпреВрд▓, рдЖрджрд┐ред рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдЕрдкрд╛рд░рджрд░реНрд╢реА
рдкреНрд░рддреАрдХ рдХреЗ рд░реВрдк рдореЗрдВ , рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╣рдЪрд╛рди рд╕рдВрдЦреНрдпрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдПрдХ рдЕрд▓рдЧ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рддреАрдХ рдХреЗ рд╕реБрдкрд╛рдареНрдп рдирд╛рдо рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдореБрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП)ред рдЬрдм рдХрдВрдкрд╛рдЗрд▓рд░
__test_reexports
рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреНрд░рддреАрдХ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди
__test_reexports
рдЖрдкрдХреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдирд╛рдо рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЕрдкрдиреЗ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рддрдХрдиреАрдХ рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рджреМрд░рд╛рди рдирд╛рдо рдЯрдХрд░рд╛рд╡ рдХреЛ рд░реЛрдХрддреА рд╣реИ рдФрд░ рд░рд╕реНрдЯ рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХрд╛ рдЖрдзрд╛рд░ рд╣реИред
рдЪрд░рдг 2: рд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рд╣рдорд╛рд░реЗ рдЯреЛрдХрд░реЗ рдХреА рдЬрдбрд╝ рд╕реЗ рд╕реБрд▓рдн рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
libsyntax
рдПрдХ рдРрд╕рд╛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рддрд╛ рд╣реИ:
pub mod __test { extern crate test; const TESTS: &'static [self::test::TestDescAndFn] = &[]; #[main] pub fn main() { self::test::test_static_main(TESTS); } }
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд░реВрдкрд╛рдВрддрд░рдг рд╕рд░рд▓ рд╣реИ, рдпрд╣ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЯреЗрд╕реНрдЯ рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЯреЗрд╕реНрдЯ
test_static_main
рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ
test_static_main
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо
TestDescAndFn
рдХреНрдпрд╛ рд╣реИ рдкрд░ рд▓реМрдЯ
TestDescAndFn
, рд▓реЗрдХрд┐рди рдлрд┐рд▓рд╣рд╛рд▓ рдореБрдЦреНрдп рдирд┐рд╖реНрдХрд░реНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЯреЛрдХрд░рд╛ рд╣реИ рдЬрд┐рд╕реЗ
рдкрд░реАрдХреНрд╖рдг рдХрд╣рд╛ рдЬрд╛рддрд╛
рд╣реИ , рдЬреЛ рд░рд╕реНрдЯ рдХреЛрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рд░рдирдЯрд╛рдЗрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
test
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕реНрдерд┐рд░ рддрд░реАрдХрд╛ рдореИрдХреНрд░реЛ
#[test]
ред
рдЪрд░рдг 3: рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд╕реНрддреБ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд░рд╕реНрдЯ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗ рдереЗ, рддреЛ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХреБрдЫ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЛ
#[should_panic]
рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
#[test] #[should_panic] fn foo() { panic!("intentional"); }
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬрд╛рдирдХрд╛рд░реА рд╣реИред
test
рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХреЛ
TestDesc рдирд╛рдордХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИред рдЯреЛрдХрд░реЗ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП,
libsyntax
рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдЧрд╛ рдФрд░
TestDesc
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЙрддреНрдкрдиреНрди
TestDesc
ред рдпрд╣ рддрдм
TestDesc
рдФрд░ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрд░рдЪрдирд╛
TestDescAndFn
, рдЬрд┐рд╕рдХреЗ
test_static_main
рдХрд╛рдо рдХрд░рддрд╛
test_static_main
ред рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП,
TestDescAndFn
рдХрд╛ рдЙрддреНрдкрдиреНрди рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
self::test::TestDescAndFn { desc: self::test::TestDesc { name: self::test::StaticTestName("foo"), ignore: false, should_panic: self::test::ShouldPanic::Yes, allow_fail: false, }, testfn: self::test::StaticTestFn(|| self::test::assert_test_result(::crate::__test_reexports::foo())), }
рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рдЗрди рдкрд░реАрдХреНрд╖рдг рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдпрд╛ рд╣реИ, рддреЛ рд╡реЗ рдЪрд░рдг 2 рдореЗрдВ рдЙрддреНрдкрдиреНрди рдмрдВрдзрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдзрд╛рд╡рдХ рдХреЛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдХрджрдо рдХреЛ рджреВрд╕рд░реЗ рдЪрд░рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╕реНрдЯрдо рдкрд░реАрдХреНрд╖рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рд╣реЛрдЧреА рдЪреМрдЦрдЯреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╣реЛрдЧрд╛ред
рдЖрдлреНрдЯрд░рд╡рд░реНрдб: рд░рд┐рд╕рд░реНрдЪ рдореЗрдердбреНрд╕
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рд╕рдВрдХрд▓рдХ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдмрд╣реБрдд рд╕реА рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓реА, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдирд╛рдЗрдЯрд▓реА рдмрд┐рд▓реНрдб рдореЗрдВ рдПрдХ рдЕрд╕реНрдерд┐рд░ рдзреНрд╡рдЬ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ
unpretty
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдореИрдХреНрд░реЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ rustc my_mod.rs -Z unpretty=hir
рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯ
рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдореИрдВ рдореИрдХреНрд░реЛ-рдкреНрд░рдХрдЯреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛:
рдХрд╕реНрдЯрдо рд╕реНрд░реЛрдд рдХреЛрдб:
#[test] fn my_test() { assert!(2+2 == 4); } fn main() {}
рдореИрдХреНрд░реЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдб:
#[prelude_import] use std::prelude::v1::*; #[macro_use] extern crate std as std; #[test] pub fn my_test() { if !(2 + 2 == 4) { { ::rt::begin_panic("assertion failed: 2 + 2 == 4", &("test_test.rs", 3u32, 3u32)) } }; } #[allow(dead_code)] fn main() { } pub mod __test_reexports { pub use super::my_test; } pub mod __test { extern crate test; #[main] pub fn main() -> () { test::test_main_static(TESTS) } const TESTS: &'static [self::test::TestDescAndFn] = &[self::test::TestDescAndFn { desc: self::test::TestDesc { name: self::test::StaticTestName("my_test"), ignore: false, should_panic: self::test::ShouldPanic::No, allow_fail: false, }, testfn: self::test::StaticTestFn(::__test_reexports::my_test), }]; }