Skip to main content

named_colour/ext/
mod.rs

1//! Extended named colours providing shades collected in enums for the main colour
2//!
3
4#[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
31/// An extended colour
32///
33/// This trait is implemented for all the extended colours
34///
35pub trait ExtendedColour {
36    /// Returns the name of the colour
37    ///
38    /// # Examples
39    ///
40    /// ```rust
41    /// # use named_colour::ExtendedColour;
42    /// # use std::str::FromStr;
43    /// # use named_colour::Black;
44    ///
45    ///     let colour = "#d3d3d3";
46    ///     let name = Black::name_colour(colour).unwrap();
47    ///     assert_eq!(Black::LightGray, name);
48    ///
49    /// ```
50    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
59/// Returns the name of the colour
60///
61///
62/// # Examples
63///
64/// ```rust
65/// use named_colour::ExtendedColour;
66/// use std::str::FromStr;
67/// use named_colour::Black;
68///
69///     let colour = "#d3d3d3";
70///     assert_eq!(Black::LightGray, named_colour::name_colour(colour).unwrap());
71///
72/// ```
73pub fn name_colour<T: ExtendedColour + FromStr>(colour: &str) -> Option<T> {
74    T::name_colour(colour)
75}
76
77/// Returns a random colour
78///
79/// # Examples
80///
81/// ```rust
82/// # use named_colour::ExtendedColour;
83///     
84///     let colour = named_colour::random_named_colour();
85///
86/// ```
87///
88pub 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}