blob: 50a012722a2b4d2551ca15d1c49baecd434952af [file] [log] [blame] [edit]
extern crate parking_lot;
use super::Color::*;
use super::{Paint, Style};
use self::parking_lot::Mutex;
static LOCK: Mutex<()> = Mutex::new(());
macro_rules! assert_renders {
($($input:expr => $expected:expr,)*) => {
let _lock = LOCK.lock();
$(
let (input, expected) = ($input.to_string(), $expected.to_string());
if input != expected {
panic!("expected {:?}, got {:?} from {:?} ({:?})",
expected, input, $input.inner(), $input.style())
}
)*
};
}
macro_rules! assert_disabled_renders {
($($input:expr => $expected:expr,)*) => {
let _lock = LOCK.lock();
$(
Paint::disable();
let (actual, expected) = ($input.to_string(), $expected.to_string());
Paint::enable();
assert_eq!(actual, expected);
)*
};
}
#[test]
fn colors_enabled() {
assert_renders! {
Paint::new("text/plain") => "text/plain",
Paint::red("hi") => "\x1B[31mhi\x1B[0m",
Paint::black("hi") => "\x1B[30mhi\x1B[0m",
Paint::yellow("hi").bold() => "\x1B[1;33mhi\x1B[0m",
Paint::new("hi").fg(Yellow).bold() => "\x1B[1;33mhi\x1B[0m",
Paint::blue("hi").underline() => "\x1B[4;34mhi\x1B[0m",
Paint::green("hi").bold().underline() => "\x1B[1;4;32mhi\x1B[0m",
Paint::green("hi").underline().bold() => "\x1B[1;4;32mhi\x1B[0m",
Paint::magenta("hi").bg(White) => "\x1B[47;35mhi\x1B[0m",
Paint::red("hi").bg(Blue).fg(Yellow) => "\x1B[44;33mhi\x1B[0m",
Paint::cyan("hi").bg(Blue).fg(Yellow) => "\x1B[44;33mhi\x1B[0m",
Paint::cyan("hi").bold().bg(White) => "\x1B[1;47;36mhi\x1B[0m",
Paint::cyan("hi").underline().bg(White) => "\x1B[4;47;36mhi\x1B[0m",
Paint::cyan("hi").bold().underline().bg(White) => "\x1B[1;4;47;36mhi\x1B[0m",
Paint::cyan("hi").underline().bold().bg(White) => "\x1B[1;4;47;36mhi\x1B[0m",
Paint::fixed(100, "hi") => "\x1B[38;5;100mhi\x1B[0m",
Paint::fixed(100, "hi").bg(Magenta) => "\x1B[45;38;5;100mhi\x1B[0m",
Paint::fixed(100, "hi").bg(Fixed(200)) => "\x1B[48;5;200;38;5;100mhi\x1B[0m",
Paint::rgb(70, 130, 180, "hi") => "\x1B[38;2;70;130;180mhi\x1B[0m",
Paint::rgb(70, 130, 180, "hi").bg(Blue) => "\x1B[44;38;2;70;130;180mhi\x1B[0m",
Paint::blue("hi").bg(RGB(70, 130, 180)) => "\x1B[48;2;70;130;180;34mhi\x1B[0m",
Paint::rgb(70, 130, 180, "hi").bg(RGB(5,10,15)) => "\x1B[48;2;5;10;15;38;2;70;130;180mhi\x1B[0m",
Paint::new("hi").bold() => "\x1B[1mhi\x1B[0m",
Paint::new("hi").underline() => "\x1B[4mhi\x1B[0m",
Paint::new("hi").bold().underline() => "\x1B[1;4mhi\x1B[0m",
Paint::new("hi").dimmed() => "\x1B[2mhi\x1B[0m",
Paint::new("hi").italic() => "\x1B[3mhi\x1B[0m",
Paint::new("hi").blink() => "\x1B[5mhi\x1B[0m",
Paint::new("hi").invert() => "\x1B[7mhi\x1B[0m",
Paint::new("hi").hidden() => "\x1B[8mhi\x1B[0m",
Paint::new("hi").strikethrough() => "\x1B[9mhi\x1B[0m",
}
}
#[test]
fn colors_disabled() {
assert_disabled_renders! {
Paint::new("text/plain") => "text/plain",
Paint::red("hi") => "hi",
Paint::black("hi") => "hi",
Paint::yellow("hi").bold() => "hi",
Paint::new("hi").fg(Yellow).bold() => "hi",
Paint::blue("hi").underline() => "hi",
Paint::green("hi").bold().underline() => "hi",
Paint::green("hi").underline().bold() => "hi",
Paint::magenta("hi").bg(White) => "hi",
Paint::red("hi").bg(Blue).fg(Yellow) => "hi",
Paint::cyan("hi").bg(Blue).fg(Yellow) => "hi",
Paint::cyan("hi").bold().bg(White) => "hi",
Paint::cyan("hi").underline().bg(White) => "hi",
Paint::cyan("hi").bold().underline().bg(White) => "hi",
Paint::cyan("hi").underline().bold().bg(White) => "hi",
Paint::fixed(100, "hi") => "hi",
Paint::fixed(100, "hi").bg(Magenta) => "hi",
Paint::fixed(100, "hi").bg(Fixed(200)) => "hi",
Paint::rgb(70, 130, 180, "hi") => "hi",
Paint::rgb(70, 130, 180, "hi").bg(Blue) => "hi",
Paint::blue("hi").bg(RGB(70, 130, 180)) => "hi",
Paint::blue("hi").bg(RGB(70, 130, 180)).wrap() => "hi",
Paint::rgb(70, 130, 180, "hi").bg(RGB(5,10,15)) => "hi",
Paint::new("hi").bold() => "hi",
Paint::new("hi").underline() => "hi",
Paint::new("hi").bold().underline() => "hi",
Paint::new("hi").dimmed() => "hi",
Paint::new("hi").italic() => "hi",
Paint::new("hi").blink() => "hi",
Paint::new("hi").invert() => "hi",
Paint::new("hi").hidden() => "hi",
Paint::new("hi").strikethrough() => "hi",
Paint::new("hi").strikethrough().wrap() => "hi",
}
}
#[test]
fn masked_when_disabled() {
assert_disabled_renders! {
Paint::masked("text/plain") => "",
Paint::masked("text/plain").mask() => "",
Paint::new("text/plain").mask() => "",
Paint::new("text/plain").mask() => "",
Paint::red("hi").mask() => "",
Paint::black("hi").mask() => "",
Paint::yellow("hi").bold().mask() => "",
Paint::cyan("hi").bg(Blue).fg(Yellow).mask() => "",
Paint::cyan("hi").underline().bold().bg(White).mask() => "",
}
}
#[test]
fn masked_when_enabled() {
assert_renders! {
Paint::masked("text/plain") => "text/plain",
Paint::masked("text/plain").mask() => "text/plain",
Paint::black("hi").mask() => "\x1B[30mhi\x1B[0m",
Paint::yellow("hi").bold().mask() => "\x1B[1;33mhi\x1B[0m",
Paint::new("hi").fg(Yellow).bold().mask() => "\x1B[1;33mhi\x1B[0m",
Paint::cyan("hi").underline().bg(White).mask() => "\x1B[4;47;36mhi\x1B[0m",
Paint::cyan("hi").bold().underline().bg(White).mask() => "\x1B[1;4;47;36mhi\x1B[0m",
Paint::rgb(70, 130, 180, "hi").mask() => "\x1B[38;2;70;130;180mhi\x1B[0m",
Paint::new("hi").underline().mask() => "\x1B[4mhi\x1B[0m",
Paint::new("hi").bold().underline().mask() => "\x1B[1;4mhi\x1B[0m",
Paint::new("hi").hidden().mask() => "\x1B[8mhi\x1B[0m",
}
}
#[test]
fn wrapping() {
let inner = || format!("{} b {}", Paint::red("a"), Paint::green("c"));
let inner2 = || format!("0 {} 1", Paint::magenta(&inner()).wrap());
assert_renders! {
Paint::new("text/plain").wrap() => "text/plain",
Paint::new(&inner()).wrap() => &inner(),
Paint::new(&inner()).wrap() =>
"\u{1b}[31ma\u{1b}[0m b \u{1b}[32mc\u{1b}[0m",
Paint::new(&inner()).fg(Blue).wrap() =>
"\u{1b}[34m\u{1b}[31ma\u{1b}[0m\u{1b}[34m b \
\u{1b}[32mc\u{1b}[0m\u{1b}[34m\u{1b}[0m",
Paint::new(&inner2()).wrap() => &inner2(),
Paint::new(&inner2()).wrap() =>
"0 \u{1b}[35m\u{1b}[31ma\u{1b}[0m\u{1b}[35m b \
\u{1b}[32mc\u{1b}[0m\u{1b}[35m\u{1b}[0m 1",
Paint::new(&inner2()).fg(Blue).wrap() =>
"\u{1b}[34m0 \u{1b}[35m\u{1b}[31ma\u{1b}[0m\u{1b}[34m\u{1b}[35m b \
\u{1b}[32mc\u{1b}[0m\u{1b}[34m\u{1b}[35m\u{1b}[0m\u{1b}[34m 1\u{1b}[0m",
}
}
#[test]
fn hash_eq() {
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
fn hash<T: Hash>(t: &T) -> u64 {
let mut s = DefaultHasher::new();
t.hash(&mut s);
s.finish()
}
let a = Style::default();
let b = Style::default().mask();
assert_eq!(a, b);
assert_eq!(hash(&a), hash(&b));
}