рдЬрдВрдЧ (рдЕрдиреБрд╡рд╛рдж) рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЙрдкрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЬреЙрди рд░реЗрдирд░ рдХреЗ рдмреНрд▓реЙрдЧ рдкрд░ "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), }]; } 

Source: https://habr.com/ru/post/hi418095/


All Articles