#[derive(Debug, Clone)]
pub struct Label {
text: String,
max_lines: Option<usize>,
truncated: bool,
}
impl Label {
pub fn new(text: impl Into<String>) -> Self {
Self {
text: text.into(),
max_lines: None,
truncated: false,
}
}
pub fn with_max_lines(mut self, n: usize) -> Self {
self.max_lines = Some(n);
self
}
pub fn text(&self) -> &str {
&self.text
}
pub fn max_lines(&self) -> Option<usize> {
self.max_lines
}
pub fn is_truncated(&self) -> bool {
self.truncated
}
pub fn set_truncated(&mut self, truncated: bool) {
self.truncated = truncated;
}
pub fn display_text(&self) -> &str {
&self.text
}
}
impl Default for Label {
fn default() -> Self {
Self::new("")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn label_new() {
let label = Label::new("hello");
assert_eq!(label.text(), "hello");
assert!(label.max_lines().is_none());
}
#[test]
fn label_is_truncated_false_initially() {
let label = Label::new("hello world");
assert!(
!label.is_truncated(),
"newly created label must not be truncated"
);
}
#[test]
fn label_set_truncated() {
let mut label = Label::new("a very long text");
assert!(!label.is_truncated());
label.set_truncated(true);
assert!(label.is_truncated());
}
#[test]
fn label_with_max_lines() {
let label = Label::new("text").with_max_lines(1);
assert_eq!(label.max_lines(), Some(1));
}
#[test]
fn label_display_text_matches_raw() {
let label = Label::new("hello");
assert_eq!(label.display_text(), "hello");
}
#[test]
fn label_default() {
let label = Label::default();
assert_eq!(label.text(), "");
assert!(!label.is_truncated());
}
}