1
1
#[ cfg( test) ]
2
2
mod integration_tests_of_err {
3
3
use sabi;
4
+ use std:: error:: Error ;
4
5
5
6
#[ derive( Debug ) ]
6
7
enum IoErrs {
7
8
FileNotFound { path : String } ,
8
9
NoPermission { path : String , r#mod : ( u8 , u8 , u8 ) } ,
10
+ DueToSomeError { path : String } ,
9
11
}
10
12
11
13
fn find_file ( ) -> Result < ( ) , sabi:: Err > {
@@ -15,14 +17,21 @@ mod integration_tests_of_err {
15
17
Err ( err)
16
18
}
17
19
18
- fn write_file ( ) -> Result < ( ) , sabi:: Err > {
20
+ fn read_file ( ) -> Result < ( ) , sabi:: Err > {
19
21
let err = sabi:: Err :: new ( IoErrs :: NoPermission {
20
22
path : "/aaa/bbb/ccc" . to_string ( ) ,
21
- r#mod : ( 6 , 6 , 6 ) ,
23
+ r#mod : ( 4 , 4 , 4 ) ,
22
24
} ) ;
23
25
Err ( err)
24
26
}
25
27
28
+ fn write_file ( ) -> Result < ( ) , sabi:: Err > {
29
+ let path = "/aaa/bbb/ccc" . to_string ( ) ;
30
+ let source = std:: io:: Error :: new ( std:: io:: ErrorKind :: AlreadyExists , path. clone ( ) ) ;
31
+ let err = sabi:: Err :: with_source ( IoErrs :: DueToSomeError { path } , source) ;
32
+ Err ( err)
33
+ }
34
+
26
35
#[ test]
27
36
fn should_create_err_and_identify_reason ( ) {
28
37
match find_file ( ) {
@@ -31,21 +40,43 @@ mod integration_tests_of_err {
31
40
Ok ( r) => match r {
32
41
IoErrs :: FileNotFound { path } => {
33
42
assert_eq ! ( path, "/aaa/bbb/ccc" ) ;
43
+ assert ! ( err. source( ) . is_none( ) ) ;
34
44
}
35
45
IoErrs :: NoPermission { path : _, r#mod : _ } => panic ! ( ) ,
46
+ IoErrs :: DueToSomeError { path : _ } => panic ! ( ) ,
36
47
} ,
37
48
_ => panic ! ( ) ,
38
49
} ,
39
50
}
40
51
41
- match write_file ( ) {
52
+ match read_file ( ) {
42
53
Ok ( _) => panic ! ( ) ,
43
54
Err ( err) => match err. reason :: < IoErrs > ( ) {
44
55
Ok ( r) => match r {
45
56
IoErrs :: FileNotFound { path : _ } => panic ! ( ) ,
46
57
IoErrs :: NoPermission { path, r#mod } => {
47
58
assert_eq ! ( path, "/aaa/bbb/ccc" ) ;
48
- assert_eq ! ( * r#mod, ( 6 , 6 , 6 ) ) ;
59
+ assert_eq ! ( * r#mod, ( 4 , 4 , 4 ) ) ;
60
+ assert ! ( err. source( ) . is_none( ) ) ;
61
+ }
62
+ IoErrs :: DueToSomeError { path : _ } => panic ! ( ) ,
63
+ } ,
64
+ _ => panic ! ( ) ,
65
+ } ,
66
+ }
67
+
68
+ match write_file ( ) {
69
+ Ok ( _) => panic ! ( ) ,
70
+ Err ( err) => match err. reason :: < IoErrs > ( ) {
71
+ Ok ( r) => match r {
72
+ IoErrs :: FileNotFound { path : _ } => panic ! ( ) ,
73
+ IoErrs :: NoPermission { path : _, r#mod : _ } => panic ! ( ) ,
74
+ IoErrs :: DueToSomeError { path } => {
75
+ assert_eq ! ( path, "/aaa/bbb/ccc" ) ;
76
+ let source = err. source ( ) . unwrap ( ) ;
77
+ let io_err = source. downcast_ref :: < std:: io:: Error > ( ) . unwrap ( ) ;
78
+ assert_eq ! ( io_err. kind( ) , std:: io:: ErrorKind :: AlreadyExists ) ;
79
+ assert_eq ! ( io_err. to_string( ) , "/aaa/bbb/ccc" ) ;
49
80
}
50
81
} ,
51
82
_ => panic ! ( ) ,
@@ -62,16 +93,29 @@ mod integration_tests_of_err {
62
93
assert_eq ! ( path, "/aaa/bbb/ccc" ) ;
63
94
}
64
95
IoErrs :: NoPermission { path : _, r#mod : _ } => panic ! ( ) ,
96
+ IoErrs :: DueToSomeError { path : _ } => panic ! ( ) ,
65
97
} ) ,
66
98
} ;
67
99
68
- match write_file ( ) {
100
+ match read_file ( ) {
69
101
Ok ( _) => panic ! ( ) ,
70
102
Err ( err) => err. match_reason :: < IoErrs > ( |r| match r {
71
103
IoErrs :: FileNotFound { path : _ } => panic ! ( ) ,
72
104
IoErrs :: NoPermission { path, r#mod } => {
73
105
assert_eq ! ( path, "/aaa/bbb/ccc" ) ;
74
- assert_eq ! ( * r#mod, ( 6 , 6 , 6 ) ) ;
106
+ assert_eq ! ( * r#mod, ( 4 , 4 , 4 ) ) ;
107
+ }
108
+ IoErrs :: DueToSomeError { path : _ } => panic ! ( ) ,
109
+ } ) ,
110
+ } ;
111
+
112
+ match write_file ( ) {
113
+ Ok ( _) => panic ! ( ) ,
114
+ Err ( err) => err. match_reason :: < IoErrs > ( |r| match r {
115
+ IoErrs :: FileNotFound { path : _ } => panic ! ( ) ,
116
+ IoErrs :: NoPermission { path : _, r#mod : _ } => panic ! ( ) ,
117
+ IoErrs :: DueToSomeError { path } => {
118
+ assert_eq ! ( path, "/aaa/bbb/ccc" ) ;
75
119
}
76
120
} ) ,
77
121
} ;
@@ -83,6 +127,10 @@ mod integration_tests_of_err {
83
127
assert ! ( err. is_reason:: <IoErrs >( ) ) ;
84
128
assert ! ( !err. is_reason:: <String >( ) ) ;
85
129
130
+ let err = read_file ( ) . unwrap_err ( ) ;
131
+ assert ! ( err. is_reason:: <IoErrs >( ) ) ;
132
+ assert ! ( !err. is_reason:: <String >( ) ) ;
133
+
86
134
let err = write_file ( ) . unwrap_err ( ) ;
87
135
assert ! ( err. is_reason:: <IoErrs >( ) ) ;
88
136
assert ! ( !err. is_reason:: <String >( ) ) ;
@@ -94,9 +142,13 @@ mod integration_tests_of_err {
94
142
//println!("{err:?}");
95
143
assert_eq ! ( format!( "{err:?}" ) , "sabi::errs::Err { reason: errs_test::integration_tests_of_err::IoErrs FileNotFound { path: \" /aaa/bbb/ccc\" } }" ) ;
96
144
145
+ let err = read_file ( ) . unwrap_err ( ) ;
146
+ //println!("{err:?}");
147
+ assert_eq ! ( format!( "{err:?}" ) , "sabi::errs::Err { reason: errs_test::integration_tests_of_err::IoErrs NoPermission { path: \" /aaa/bbb/ccc\" , mod: (4, 4, 4) } }" ) ;
148
+
97
149
let err = write_file ( ) . unwrap_err ( ) ;
98
150
//println!("{err:?}");
99
- assert_eq ! ( format!( "{err:?}" ) , "sabi::errs::Err { reason: errs_test::integration_tests_of_err::IoErrs NoPermission { path: \" /aaa/bbb/ccc\" , mod: (6, 6, 6) } }" ) ;
151
+ assert_eq ! ( format!( "{err:?}" ) , "sabi::errs::Err { reason: errs_test::integration_tests_of_err::IoErrs DueToSomeError { path: \" /aaa/bbb/ccc\" } }" ) ;
100
152
}
101
153
102
154
#[ test]
@@ -105,13 +157,38 @@ mod integration_tests_of_err {
105
157
//println!("{err}");
106
158
assert_eq ! ( format!( "{err}" ) , "FileNotFound { path: \" /aaa/bbb/ccc\" }" ) ;
107
159
160
+ let err = read_file ( ) . unwrap_err ( ) ;
161
+ //println!("{err}");
162
+ assert_eq ! (
163
+ format!( "{err}" ) ,
164
+ "NoPermission { path: \" /aaa/bbb/ccc\" , mod: (4, 4, 4) }"
165
+ ) ;
166
+
108
167
let err = write_file ( ) . unwrap_err ( ) ;
109
168
//println!("{err}");
110
169
assert_eq ! (
111
170
format!( "{err}" ) ,
112
- "NoPermission { path: \" /aaa/bbb/ccc\" , mod: (6, 6, 6) }"
171
+ "DueToSomeError { path: \" /aaa/bbb/ccc\" }"
113
172
) ;
114
173
}
174
+
175
+ #[ test]
176
+ fn should_get_source_of_err ( ) {
177
+ let err = find_file ( ) . unwrap_err ( ) ;
178
+ assert ! ( err. source( ) . is_none( ) ) ;
179
+
180
+ let err = read_file ( ) . unwrap_err ( ) ;
181
+ assert ! ( err. source( ) . is_none( ) ) ;
182
+
183
+ let err = write_file ( ) . unwrap_err ( ) ;
184
+ if let Some ( source) = err. source ( ) {
185
+ let io_err = source. downcast_ref :: < std:: io:: Error > ( ) . unwrap ( ) ;
186
+ assert_eq ! ( io_err. kind( ) , std:: io:: ErrorKind :: AlreadyExists ) ;
187
+ assert_eq ! ( io_err. to_string( ) , "/aaa/bbb/ccc" ) ;
188
+ } else {
189
+ panic ! ( ) ;
190
+ }
191
+ }
115
192
}
116
193
117
194
#[ test]
0 commit comments