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