1#[macro_export]
41macro_rules! assert_lt {
42 ($left:expr, $right:expr $(,)?) => {
43 match (&$left, &$right) {
44 (left_val, right_val) => {
45 if !(*left_val < *right_val) {
46 ::core::panic!(r#"assertion failed: `(left < right)`
50 left: `{:?}`,
51 right: `{:?}`"#, &*left_val, &*right_val)
52 }
53 }
54 }
55 };
56 ($left:expr, $right:expr, $($arg:tt)+) => {
57 match (&$left, &$right) {
58 (left_val, right_val) => {
59 if !(*left_val < *right_val) {
60 ::core::panic!(r#"assertion failed: `(left < right)`
64 left: `{:?}`,
65 right: `{:?}`: {}"#, &*left_val, &*right_val, ::core::format_args!($($arg)+))
66 }
67 }
68 }
69 };
70}
71
72#[macro_export]
76macro_rules! debug_assert_lt {
77 ($($arg:tt)*) => {
78 #[cfg(debug_assertions)]
79 $crate::assert_lt!($($arg)*);
80 }
81}
82
83#[cfg(test)]
84mod tests {
85 #[test]
86 #[should_panic(expected = "assertion failed: `(left < right)`\n left: `5`,\n right: `3`")]
87 fn greater_than() {
88 assert_lt!(5, 3);
89 }
90
91 #[test]
92 #[should_panic(expected = "assertion failed: `(left < right)`\n left: `3`,\n right: `3`")]
93 fn equal() {
94 assert_lt!(3, 3);
95 }
96
97 #[test]
98 fn less_than() {
99 assert_lt!(1, 3);
100 }
101
102 #[test]
103 #[should_panic(
104 expected = "assertion failed: `(left < right)`\n left: `5`,\n right: `3`: foo"
105 )]
106 fn greater_than_custom_message() {
107 assert_lt!(5, 3, "foo");
108 }
109
110 #[test]
111 #[should_panic(
112 expected = "assertion failed: `(left < right)`\n left: `3`,\n right: `3`: foo"
113 )]
114 fn equal_custom_message() {
115 assert_lt!(3, 3, "foo");
116 }
117
118 #[test]
119 #[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
120 #[should_panic(expected = "assertion failed: `(left < right)`\n left: `5`,\n right: `3`")]
121 fn debug_greater_than() {
122 debug_assert_lt!(5, 3);
123 }
124
125 #[test]
126 #[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
127 #[should_panic(expected = "assertion failed: `(left < right)`\n left: `3`,\n right: `3`")]
128 fn debug_equal() {
129 debug_assert_lt!(3, 3);
130 }
131
132 #[test]
133 #[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
134 fn debug_less_than() {
135 debug_assert_lt!(1, 3);
136 }
137
138 #[test]
139 #[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
140 #[should_panic(
141 expected = "assertion failed: `(left < right)`\n left: `5`,\n right: `3`: foo"
142 )]
143 fn debug_greater_than_custom_message() {
144 debug_assert_lt!(5, 3, "foo");
145 }
146
147 #[test]
148 #[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
149 #[should_panic(
150 expected = "assertion failed: `(left < right)`\n left: `3`,\n right: `3`: foo"
151 )]
152 fn debug_equal_custom_message() {
153 debug_assert_lt!(3, 3, "foo");
154 }
155
156 #[test]
157 #[cfg_attr(debug_assertions, ignore = "only run in release mode")]
158 fn debug_release_greater_than() {
159 debug_assert_lt!(5, 3);
160 }
161
162 #[test]
163 #[cfg_attr(debug_assertions, ignore = "only run in release mode")]
164 fn debug_release_equal() {
165 debug_assert_lt!(3, 3);
166 }
167}