1#[macro_use]
5mod macros;
6
7mod black;
8mod blue;
9mod brown;
10mod cyan;
11mod green;
12mod purple;
13mod red;
14mod white;
15mod yellow;
16
17use std::str::FromStr;
18
19use tinyrand::{RandRange, StdRand};
20
21pub use black::Black;
22pub use blue::Blue;
23pub use brown::Brown;
24pub use cyan::Cyan;
25pub use green::Green;
26pub use purple::Purple;
27pub use red::Red;
28pub use white::White;
29pub use yellow::Yellow;
30
31pub trait ExtendedColour {
36 fn name_colour(colour: &str) -> Option<Self>
51 where
52 Self: Sized,
53 Self: FromStr,
54 {
55 Self::from_str(colour).ok()
56 }
57}
58
59pub fn name_colour<T: ExtendedColour + FromStr>(colour: &str) -> Option<T> {
74 T::name_colour(colour)
75}
76
77pub fn random_named_colour() -> Box<dyn ExtendedColour> {
89 let mut rand = StdRand::default();
90
91 let family = rand.next_range(0..8_u32);
92 match family {
93 0 => Box::new(Black::random()),
94 1 => Box::new(Blue::random()),
95 2 => Box::new(Brown::random()),
96 3 => Box::new(Cyan::random()),
97 4 => Box::new(Green::random()),
98 5 => Box::new(Purple::random()),
99 6 => Box::new(Red::random()),
100 7 => Box::new(White::random()),
101 8 => Box::new(Yellow::random()),
102 _ => Box::new(Black::random()),
103 }
104}
105
106#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
107enum AnonColour {
108 NotNamed,
109}
110
111impl FromStr for AnonColour {
112 type Err = ();
113 fn from_str(_: &str) -> Result<Self, Self::Err> {
114 Ok(AnonColour::NotNamed)
115 }
116}
117
118impl ExtendedColour for AnonColour {}
119
120#[cfg(test)]
121mod tests {
122 use rstest::rstest;
123
124 use super::*;
125
126 #[rstest]
127 #[case("#123456", Some(AnonColour::NotNamed))]
128 #[case("#708090", Some(Black::SlateGray))]
129 #[case("708090", Some(Black::SlateGray))]
130 #[case("slategray", Some(Black::SlateGray))]
131 #[case("slategrey", Some(Black::SlateGrey))]
132 #[case("#778899", Some(Black::LightSlateGray))]
133 #[case("778899", Some(Black::LightSlateGray))]
134 #[case("lightslategray", Some(Black::LightSlateGray))]
135 #[case("lightslategrey", Some(Black::LightSlateGrey))]
136 #[case("#000000", Some(Black::Black))]
137 #[case("000000", Some(Black::Black))]
138 #[case("black", Some(Black::Black))]
139 #[case("#696969", Some(Black::DimGray))]
140 #[case("696969", Some(Black::DimGray))]
141 #[case("dimgray", Some(Black::DimGray))]
142 #[case("dimgrey", Some(Black::DimGrey))]
143 #[case("#808080", Some(Black::Gray))]
144 #[case("808080", Some(Black::Gray))]
145 #[case("gray", Some(Black::Gray))]
146 #[case("grey", Some(Black::Grey))]
147 #[case("#A9A9A9", Some(Black::DarkGray))]
148 #[case("A9A9A9", Some(Black::DarkGray))]
149 #[case("darkgray", Some(Black::DarkGray))]
150 #[case("darkgrey", Some(Black::DarkGrey))]
151 #[case("#C0C0C0", Some(Black::Silver))]
152 #[case("C0C0C0", Some(Black::Silver))]
153 #[case("silver", Some(Black::Silver))]
154 #[case("#D3D3D3", Some(Black::LightGray))]
155 #[case("D3D3D3", Some(Black::LightGray))]
156 #[case("lightgray", Some(Black::LightGray))]
157 #[case("lightgrey", Some(Black::LightGrey))]
158 #[case("#DCDCDC", Some(Black::Gainsboro))]
159 #[case("DCDCDC", Some(Black::Gainsboro))]
160 #[case("gainsboro", Some(Black::Gainsboro))]
161 #[case("#b0e0e6", Some(Blue::PowderBlue))]
162 #[case("b0e0e6", Some(Blue::PowderBlue))]
163 #[case("powderblue", Some(Blue::PowderBlue))]
164 #[case("#5f9ea0", Some(Blue::CadetBlue))]
165 #[case("5f9ea0", Some(Blue::CadetBlue))]
166 #[case("cadetblue", Some(Blue::CadetBlue))]
167 #[case("#4682b4", Some(Blue::SteelBlue))]
168 #[case("4682b4", Some(Blue::SteelBlue))]
169 #[case("steelblue", Some(Blue::SteelBlue))]
170 #[case("#6495ed", Some(Blue::CornflowerBlue))]
171 #[case("6495ed", Some(Blue::CornflowerBlue))]
172 #[case("cornflowerblue", Some(Blue::CornflowerBlue))]
173 #[case("#00bfff", Some(Blue::DeepSkyBlue))]
174 #[case("00bfff", Some(Blue::DeepSkyBlue))]
175 #[case("deepskyblue", Some(Blue::DeepSkyBlue))]
176 #[case("#1e90ff", Some(Blue::DodgerBlue))]
177 #[case("1e90ff", Some(Blue::DodgerBlue))]
178 #[case("dodgerblue", Some(Blue::DodgerBlue))]
179 #[case("#add8e6", Some(Blue::LightBlue))]
180 #[case("add8e6", Some(Blue::LightBlue))]
181 #[case("lightblue", Some(Blue::LightBlue))]
182 #[case("#87ceeb", Some(Blue::SkyBlue))]
183 #[case("87ceeb", Some(Blue::SkyBlue))]
184 #[case("skyblue", Some(Blue::SkyBlue))]
185 #[case("#b0c4de", Some(Blue::LightSteelBlue))]
186 #[case("b0c4de", Some(Blue::LightSteelBlue))]
187 #[case("lightsteelblue", Some(Blue::LightSteelBlue))]
188 #[case("#87cefa", Some(Blue::LightSkyBlue))]
189 #[case("87cefa", Some(Blue::LightSkyBlue))]
190 #[case("lightskyblue", Some(Blue::LightSkyBlue))]
191 #[case("#191970", Some(Blue::MidnightBlue))]
192 #[case("191970", Some(Blue::MidnightBlue))]
193 #[case("midnightblue", Some(Blue::MidnightBlue))]
194 #[case("#000080", Some(Blue::Navy))]
195 #[case("000080", Some(Blue::Navy))]
196 #[case("navy", Some(Blue::Navy))]
197 #[case("#00008b", Some(Blue::DarkBlue))]
198 #[case("00008b", Some(Blue::DarkBlue))]
199 #[case("darkblue", Some(Blue::DarkBlue))]
200 #[case("#0000cd", Some(Blue::MediumBlue))]
201 #[case("0000cd", Some(Blue::MediumBlue))]
202 #[case("mediumblue", Some(Blue::MediumBlue))]
203 #[case("#0000ff", Some(Blue::Blue))]
204 #[case("0000ff", Some(Blue::Blue))]
205 #[case("blue", Some(Blue::Blue))]
206 #[case("#4169e1", Some(Blue::RoyalBlue))]
207 #[case("4169e1", Some(Blue::RoyalBlue))]
208 #[case("royalblue", Some(Blue::RoyalBlue))]
209 #[case("#f0ffff", Some(Blue::Azure))]
210 #[case("f0ffff", Some(Blue::Azure))]
211 #[case("azure", Some(Blue::Azure))]
212 #[case("#8b4513", Some(Brown::SaddleBrown))]
213 #[case("#a0522d", Some(Brown::Sienna))]
214 #[case("#d2691e", Some(Brown::Chocolate))]
215 #[case("#cd853f", Some(Brown::Peru))]
216 #[case("#f4a460", Some(Brown::SandyBrown))]
217 #[case("#deb887", Some(Brown::BurlyWood))]
218 #[case("#d2b48c", Some(Brown::Tan))]
219 #[case("#bc8f8f", Some(Brown::RosyBrown))]
220 #[case("8b4513", Some(Brown::SaddleBrown))]
221 #[case("a0522d", Some(Brown::Sienna))]
222 #[case("d2691e", Some(Brown::Chocolate))]
223 #[case("cd853f", Some(Brown::Peru))]
224 #[case("f4a460", Some(Brown::SandyBrown))]
225 #[case("deb887", Some(Brown::BurlyWood))]
226 #[case("d2b48c", Some(Brown::Tan))]
227 #[case("bc8f8f", Some(Brown::RosyBrown))]
228 #[case("saddlebrown", Some(Brown::SaddleBrown))]
229 #[case("sienna", Some(Brown::Sienna))]
230 #[case("chocolate", Some(Brown::Chocolate))]
231 #[case("peru", Some(Brown::Peru))]
232 #[case("sandybrown", Some(Brown::SandyBrown))]
233 #[case("burlywood", Some(Brown::BurlyWood))]
234 #[case("tan", Some(Brown::Tan))]
235 #[case("rosybrown", Some(Brown::RosyBrown))]
236 #[case("#66cdaa", Some(Cyan::MediumAquaMarine))]
237 #[case("66cdaa", Some(Cyan::MediumAquaMarine))]
238 #[case("mediumaquamarine", Some(Cyan::MediumAquaMarine))]
239 #[case("#3cb371", Some(Cyan::MediumSeaGreen))]
240 #[case("3cb371", Some(Cyan::MediumSeaGreen))]
241 #[case("mediumseagreen", Some(Cyan::MediumSeaGreen))]
242 #[case("#20b2aa", Some(Cyan::LightSeaGreen))]
243 #[case("20b2aa", Some(Cyan::LightSeaGreen))]
244 #[case("lightseagreen", Some(Cyan::LightSeaGreen))]
245 #[case("#2f4f4f", Some(Cyan::DarkSlateGray))]
246 #[case("2f4f4f", Some(Cyan::DarkSlateGray))]
247 #[case("darkslategray", Some(Cyan::DarkSlateGray))]
248 #[case("#008080", Some(Cyan::Teal))]
249 #[case("008080", Some(Cyan::Teal))]
250 #[case("teal", Some(Cyan::Teal))]
251 #[case("#008b8b", Some(Cyan::DarkCyan))]
252 #[case("008b8b", Some(Cyan::DarkCyan))]
253 #[case("darkcyan", Some(Cyan::DarkCyan))]
254 #[case("#00ffff", Some(Cyan::Aqua))]
255 #[case("00ffff", Some(Cyan::Aqua))]
256 #[case("aqua", Some(Cyan::Aqua))]
257 #[case("cyan", Some(Cyan::Cyan))]
258 #[case("#e0ffff", Some(Cyan::LightCyan))]
259 #[case("e0ffff", Some(Cyan::LightCyan))]
260 #[case("lightcyan", Some(Cyan::LightCyan))]
261 #[case("#00ced1", Some(Cyan::DarkTurquoise))]
262 #[case("00ced1", Some(Cyan::DarkTurquoise))]
263 #[case("darkturquoise", Some(Cyan::DarkTurquoise))]
264 #[case("#40e0d0", Some(Cyan::Turquoise))]
265 #[case("40e0d0", Some(Cyan::Turquoise))]
266 #[case("turquoise", Some(Cyan::Turquoise))]
267 #[case("#48d1cc", Some(Cyan::MediumTurquoise))]
268 #[case("48d1cc", Some(Cyan::MediumTurquoise))]
269 #[case("mediumturquoise", Some(Cyan::MediumTurquoise))]
270 #[case("#afeeee", Some(Cyan::PaleTurquoise))]
271 #[case("afeeee", Some(Cyan::PaleTurquoise))]
272 #[case("paleturquoise", Some(Cyan::PaleTurquoise))]
273 #[case("#7fffd4", Some(Cyan::AquaMarine))]
274 #[case("7fffd4", Some(Cyan::AquaMarine))]
275 #[case("aquamarine", Some(Cyan::AquaMarine))]
276 #[case("#f0fff0", Some(Cyan::Honeydew))]
277 #[case("f0fff0", Some(Cyan::Honeydew))]
278 #[case("honeydew", Some(Cyan::Honeydew))]
279 #[case("#9acd32", Some(Green::YellowGreen))]
280 #[case("9acd32", Some(Green::YellowGreen))]
281 #[case("yellowgreen", Some(Green::YellowGreen))]
282 #[case("#556b2f", Some(Green::DarkOliveGreen))]
283 #[case("556b2f", Some(Green::DarkOliveGreen))]
284 #[case("darkolivegreen", Some(Green::DarkOliveGreen))]
285 #[case("#808000", Some(Green::Olive))]
286 #[case("808000", Some(Green::Olive))]
287 #[case("olive", Some(Green::Olive))]
288 #[case("#6b8e23", Some(Green::OliveDrab))]
289 #[case("6b8e23", Some(Green::OliveDrab))]
290 #[case("olivedrab", Some(Green::OliveDrab))]
291 #[case("#7cfc00", Some(Green::LawnGreen))]
292 #[case("7cfc00", Some(Green::LawnGreen))]
293 #[case("lawngreen", Some(Green::LawnGreen))]
294 #[case("#7fff00", Some(Green::ChartReuse))]
295 #[case("7fff00", Some(Green::ChartReuse))]
296 #[case("chartreuse", Some(Green::ChartReuse))]
297 #[case("#adff2f", Some(Green::GreenYellow))]
298 #[case("adff2f", Some(Green::GreenYellow))]
299 #[case("greenyellow", Some(Green::GreenYellow))]
300 #[case("#008000", Some(Green::Green))]
301 #[case("008000", Some(Green::Green))]
302 #[case("green", Some(Green::Green))]
303 #[case("#228b22", Some(Green::ForestGreen))]
304 #[case("228b22", Some(Green::ForestGreen))]
305 #[case("forestgreen", Some(Green::ForestGreen))]
306 #[case("#00ff7f", Some(Green::SpringGreen))]
307 #[case("00ff7f", Some(Green::SpringGreen))]
308 #[case("springgreen", Some(Green::SpringGreen))]
309 #[case("#98fb98", Some(Green::PaleGreen))]
310 #[case("98fb98", Some(Green::PaleGreen))]
311 #[case("palegreen", Some(Green::PaleGreen))]
312 #[case("#8fbc8f", Some(Green::DarkSeaGreen))]
313 #[case("8fbc8f", Some(Green::DarkSeaGreen))]
314 #[case("darkseagreen", Some(Green::DarkSeaGreen))]
315 #[case("#00fa9a", Some(Green::MediumSpringGreen))]
316 #[case("00fa9a", Some(Green::MediumSpringGreen))]
317 #[case("mediumspringgreen", Some(Green::MediumSpringGreen))]
318 #[case("#2e8b57", Some(Green::SeaGreen))]
319 #[case("2e8b57", Some(Green::SeaGreen))]
320 #[case("seagreen", Some(Green::SeaGreen))]
321 #[case("#800000", Some(Red::Maroon))]
322 #[case("800000", Some(Red::Maroon))]
323 #[case("maroon", Some(Red::Maroon))]
324 #[case("#8b0000", Some(Red::DarkRed))]
325 #[case("8b0000", Some(Red::DarkRed))]
326 #[case("darkred", Some(Red::DarkRed))]
327 #[case("#a52a2a", Some(Red::Brown))]
328 #[case("a52a2a", Some(Red::Brown))]
329 #[case("brown", Some(Red::Brown))]
330 #[case("#b22222", Some(Red::Firebrick))]
331 #[case("b22222", Some(Red::Firebrick))]
332 #[case("firebrick", Some(Red::Firebrick))]
333 #[case("#dc143c", Some(Red::Crimson))]
334 #[case("dc143c", Some(Red::Crimson))]
335 #[case("crimson", Some(Red::Crimson))]
336 #[case("#ff0000", Some(Red::Red))]
337 #[case("ff0000", Some(Red::Red))]
338 #[case("red", Some(Red::Red))]
339 #[case("#ff6347", Some(Red::Tomato))]
340 #[case("ff6347", Some(Red::Tomato))]
341 #[case("tomato", Some(Red::Tomato))]
342 #[case("#ff7f50", Some(Red::Coral))]
343 #[case("ff7f50", Some(Red::Coral))]
344 #[case("coral", Some(Red::Coral))]
345 #[case("#cd5c5c", Some(Red::IndianRed))]
346 #[case("cd5c5c", Some(Red::IndianRed))]
347 #[case("indianred", Some(Red::IndianRed))]
348 #[case("#f08080", Some(Red::LightCoral))]
349 #[case("f08080", Some(Red::LightCoral))]
350 #[case("lightcoral", Some(Red::LightCoral))]
351 #[case("#e9967a", Some(Red::DarkSalmon))]
352 #[case("e9967a", Some(Red::DarkSalmon))]
353 #[case("darksalmon", Some(Red::DarkSalmon))]
354 #[case("#fa8072", Some(Red::Salmon))]
355 #[case("fa8072", Some(Red::Salmon))]
356 #[case("salmon", Some(Red::Salmon))]
357 #[case("#ffa07a", Some(Red::LightSalmon))]
358 #[case("ffa07a", Some(Red::LightSalmon))]
359 #[case("lightsalmon", Some(Red::LightSalmon))]
360 #[case("#ff4500", Some(Red::OrangeRed))]
361 #[case("ff4500", Some(Red::OrangeRed))]
362 #[case("orangered", Some(Red::OrangeRed))]
363 #[case("#ff8c00", Some(Red::DarkOrange))]
364 #[case("ff8c00", Some(Red::DarkOrange))]
365 #[case("darkorange", Some(Red::DarkOrange))]
366 #[case("#ffa500", Some(Red::Orange))]
367 #[case("ffa500", Some(Red::Orange))]
368 #[case("orange", Some(Red::Orange))]
369 #[case("#4b0082", Some(Purple::Indigo))]
370 #[case("4b0082", Some(Purple::Indigo))]
371 #[case("indigo", Some(Purple::Indigo))]
372 #[case("#800080", Some(Purple::Purple))]
373 #[case("800080", Some(Purple::Purple))]
374 #[case("purple", Some(Purple::Purple))]
375 #[case("#8b008b", Some(Purple::DarkMagenta))]
376 #[case("8b008b", Some(Purple::DarkMagenta))]
377 #[case("darkmagenta", Some(Purple::DarkMagenta))]
378 #[case("#9400d3", Some(Purple::DarkViolet))]
379 #[case("9400d3", Some(Purple::DarkViolet))]
380 #[case("darkviolet", Some(Purple::DarkViolet))]
381 #[case("#483d8b", Some(Purple::DarkSlateBlue))]
382 #[case("483d8b", Some(Purple::DarkSlateBlue))]
383 #[case("darkslateblue", Some(Purple::DarkSlateBlue))]
384 #[case("#8a2be2", Some(Purple::BlueViolet))]
385 #[case("8a2be2", Some(Purple::BlueViolet))]
386 #[case("blueviolet", Some(Purple::BlueViolet))]
387 #[case("#9932cc", Some(Purple::DarkOrchid))]
388 #[case("9932cc", Some(Purple::DarkOrchid))]
389 #[case("darkorchid", Some(Purple::DarkOrchid))]
390 #[case("#a020f0", Some(Purple::Fuchsia))]
391 #[case("a020f0", Some(Purple::Fuchsia))]
392 #[case("fuchsia", Some(Purple::Fuchsia))]
393 #[case("#ff00ff", Some(Purple::Magenta))]
394 #[case("ff00ff", Some(Purple::Magenta))]
395 #[case("magenta", Some(Purple::Magenta))]
396 #[case("#6a5acd", Some(Purple::SlateBlue))]
397 #[case("6a5acd", Some(Purple::SlateBlue))]
398 #[case("slateblue", Some(Purple::SlateBlue))]
399 #[case("#7b68ee", Some(Purple::MediumSlateBlue))]
400 #[case("7b68ee", Some(Purple::MediumSlateBlue))]
401 #[case("mediumslateblue", Some(Purple::MediumSlateBlue))]
402 #[case("#ba55d3", Some(Purple::MediumOrchid))]
403 #[case("ba55d3", Some(Purple::MediumOrchid))]
404 #[case("mediumorchid", Some(Purple::MediumOrchid))]
405 #[case("#9370db", Some(Purple::MediumPurple))]
406 #[case("9370db", Some(Purple::MediumPurple))]
407 #[case("mediumpurple", Some(Purple::MediumPurple))]
408 #[case("#da70d6", Some(Purple::Orchid))]
409 #[case("da70d6", Some(Purple::Orchid))]
410 #[case("orchid", Some(Purple::Orchid))]
411 #[case("#ee82ee", Some(Purple::Violet))]
412 #[case("ee82ee", Some(Purple::Violet))]
413 #[case("violet", Some(Purple::Violet))]
414 #[case("#dda0dd", Some(Purple::Plum))]
415 #[case("dda0dd", Some(Purple::Plum))]
416 #[case("plum", Some(Purple::Plum))]
417 #[case("#d8bfd8", Some(Purple::Thistle))]
418 #[case("d8bfd8", Some(Purple::Thistle))]
419 #[case("thistle", Some(Purple::Thistle))]
420 #[case("#e6e6fa", Some(Purple::Lavender))]
421 #[case("e6e6fa", Some(Purple::Lavender))]
422 #[case("lavender", Some(Purple::Lavender))]
423 #[case("#ffc0cb", Some(Purple::Pink))]
424 #[case("ffc0cb", Some(Purple::Pink))]
425 #[case("pink", Some(Purple::Pink))]
426 #[case("#c71585", Some(Purple::MediumVioletRed))]
427 #[case("c71585", Some(Purple::MediumVioletRed))]
428 #[case("mediumvioletred", Some(Purple::MediumVioletRed))]
429 #[case("#db7093", Some(Purple::PaleVioletRed))]
430 #[case("db7093", Some(Purple::PaleVioletRed))]
431 #[case("palevioletred", Some(Purple::PaleVioletRed))]
432 #[case("deeppink", Some(Purple::DeepPink))]
433 #[case("ff1493", Some(Purple::DeepPink))]
434 #[case("deeppink", Some(Purple::DeepPink))]
435 #[case("#ff69b4", Some(Purple::HotPink))]
436 #[case("ff69b4", Some(Purple::HotPink))]
437 #[case("hotpink", Some(Purple::HotPink))]
438 #[case("#ffb6c1", Some(Purple::LightPink))]
439 #[case("ffb6c1", Some(Purple::LightPink))]
440 #[case("lightpink", Some(Purple::LightPink))]
441 #[case("#faebd7", Some(White::AntiqueWhite))]
442 #[case("faebd7", Some(White::AntiqueWhite))]
443 #[case("AntiqueWhite", Some(White::AntiqueWhite))]
444 #[case("#f5f5dc", Some(White::Beige))]
445 #[case("f5f5dc", Some(White::Beige))]
446 #[case("Beige", Some(White::Beige))]
447 #[case("#ffe4c4", Some(White::Bisque))]
448 #[case("ffe4c4", Some(White::Bisque))]
449 #[case("Bisque", Some(White::Bisque))]
450 #[case("#ffebcd", Some(White::BlanchedAlmond))]
451 #[case("ffebcd", Some(White::BlanchedAlmond))]
452 #[case("BlanchedAlmond", Some(White::BlanchedAlmond))]
453 #[case("#f5deb3", Some(White::Wheat))]
454 #[case("f5deb3", Some(White::Wheat))]
455 #[case("wheat", Some(White::Wheat))]
456 #[case("#fff8dc", Some(White::CornSilk))]
457 #[case("fff8dc", Some(White::CornSilk))]
458 #[case("CornSilk", Some(White::CornSilk))]
459 #[case("#ffffff", Some(White::White))]
460 #[case("ffffff", Some(White::White))]
461 #[case("White", Some(White::White))]
462 #[case("#ffdead", Some(White::NavajoWhite))]
463 #[case("ffdead", Some(White::NavajoWhite))]
464 #[case("NavajoWhite", Some(White::NavajoWhite))]
465 #[case("#ffe4e1", Some(White::MistyRose))]
466 #[case("ffe4e1", Some(White::MistyRose))]
467 #[case("MistyRose", Some(White::MistyRose))]
468 #[case("#fff0f5", Some(White::LavenderBlush))]
469 #[case("fff0f5", Some(White::LavenderBlush))]
470 #[case("LavenderBlush", Some(White::LavenderBlush))]
471 #[case("#faf0e6", Some(White::Linen))]
472 #[case("faf0e6", Some(White::Linen))]
473 #[case("Linen", Some(White::Linen))]
474 #[case("#fdf5e6", Some(White::OldLace))]
475 #[case("fdf5e6", Some(White::OldLace))]
476 #[case("OldLace", Some(White::OldLace))]
477 #[case("#fff5ee", Some(White::SeaShell))]
478 #[case("fff5ee", Some(White::SeaShell))]
479 #[case("SeaShell", Some(White::SeaShell))]
480 #[case("#f5fffa", Some(White::MintCream))]
481 #[case("f5fffa", Some(White::MintCream))]
482 #[case("MintCream", Some(White::MintCream))]
483 #[case("#fffaf0", Some(White::FloralWhite))]
484 #[case("fffaf0", Some(White::FloralWhite))]
485 #[case("FloralWhite", Some(White::FloralWhite))]
486 #[case("#f8f8ff", Some(White::GhostWhite))]
487 #[case("f8f8ff", Some(White::GhostWhite))]
488 #[case("GhostWhite", Some(White::GhostWhite))]
489 #[case("#fffff0", Some(White::Ivory))]
490 #[case("fffff0", Some(White::Ivory))]
491 #[case("Ivory", Some(White::Ivory))]
492 #[case("#fffafa", Some(White::Snow))]
493 #[case("fffafa", Some(White::Snow))]
494 #[case("Snow", Some(White::Snow))]
495 #[case("#f5f5f5", Some(White::WhiteSmoke))]
496 #[case("f5f5f5", Some(White::WhiteSmoke))]
497 #[case("WhiteSmoke", Some(White::WhiteSmoke))]
498 #[case("#f0f8ff", Some(White::AliceBlue))]
499 #[case("f0f8ff", Some(White::AliceBlue))]
500 #[case("AliceBlue", Some(White::AliceBlue))]
501 #[case("#ffd700", Some(Yellow::Gold))]
502 #[case("ffd700", Some(Yellow::Gold))]
503 #[case("Gold", Some(Yellow::Gold))]
504 #[case("#b8860b", Some(Yellow::DarkGoldenrod))]
505 #[case("b8860b", Some(Yellow::DarkGoldenrod))]
506 #[case("DarkGoldenRod", Some(Yellow::DarkGoldenrod))]
507 #[case("#dab500", Some(Yellow::Goldenrod))]
508 #[case("dab500", Some(Yellow::Goldenrod))]
509 #[case("GoldenRod", Some(Yellow::Goldenrod))]
510 #[case("#eee8aa", Some(Yellow::PaleGoldenrod))]
511 #[case("eee8aa", Some(Yellow::PaleGoldenrod))]
512 #[case("PaleGoldenRod", Some(Yellow::PaleGoldenrod))]
513 #[case("#bdb76b", Some(Yellow::DarkKhaki))]
514 #[case("bdb76b", Some(Yellow::DarkKhaki))]
515 #[case("DarkKhaki", Some(Yellow::DarkKhaki))]
516 #[case("#f0e68c", Some(Yellow::Khaki))]
517 #[case("f0e68c", Some(Yellow::Khaki))]
518 #[case("Khaki", Some(Yellow::Khaki))]
519 #[case("#ffff00", Some(Yellow::Yellow))]
520 #[case("ffff00", Some(Yellow::Yellow))]
521 #[case("Yellow", Some(Yellow::Yellow))]
522 #[case("#9acd32", Some(Yellow::YellowGreen))]
523 #[case("9acd32", Some(Yellow::YellowGreen))]
524 #[case("YellowGreen", Some(Yellow::YellowGreen))]
525 #[case("#ffdab9", Some(Yellow::PeachPuff))]
526 #[case("ffdab9", Some(Yellow::PeachPuff))]
527 #[case("PeachPuff", Some(Yellow::PeachPuff))]
528 #[case("#ffe4b5", Some(Yellow::Moccasin))]
529 #[case("ffe4b5", Some(Yellow::Moccasin))]
530 #[case("Moccasin", Some(Yellow::Moccasin))]
531 #[case("#ffefd5", Some(Yellow::PapayaWhip))]
532 #[case("ffefd5", Some(Yellow::PapayaWhip))]
533 #[case("PapayaWhip", Some(Yellow::PapayaWhip))]
534 #[case("#fffacd", Some(Yellow::LemonChiffon))]
535 #[case("fffacd", Some(Yellow::LemonChiffon))]
536 #[case("LemonChiffon", Some(Yellow::LemonChiffon))]
537 #[case("#fafad2", Some(Yellow::LightGoldenrodYellow))]
538 #[case("fafad2", Some(Yellow::LightGoldenrodYellow))]
539 #[case("LightGoldenrodYellow", Some(Yellow::LightGoldenrodYellow))]
540 #[case("#ffffe0", Some(Yellow::LightYellow))]
541 #[case("ffffe0", Some(Yellow::LightYellow))]
542 #[case("LightYellow", Some(Yellow::LightYellow))]
543 fn test_name_colour<T: ExtendedColour + std::cmp::PartialEq + std::fmt::Debug + FromStr>(
544 #[case] input: &str,
545 #[case] expected: Option<T>,
546 ) {
547 assert_eq!(expected, T::name_colour(input))
548 }
549}