// #![allow(dead_code)]
trait Reverse: PartialEq + Sized {
    fn reverse(&self) -> Self;
    fn is_palindrome(self) -> bool {
        return self == self.reverse();
    }
}
impl Reverse for i32 {
    fn reverse(self: &Self) -> Self {
        let mut x = *self;
        let mut revert = 0;
        while x > 0 {
            revert = revert * 10 + x % 10;
            x /= 10;
        }
        return revert;
    }
}
impl Reverse for String {
    fn reverse(self: &Self) -> Self {
        return self.to_string().chars().rev().collect();
    }
}

fn main() {}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_回文奇数() {
        assert_eq!(12321.is_palindrome(), true);
    }
    #[test]
    fn test_回文偶数() {
        assert_eq!(123321.is_palindrome(), true);
    }
    #[test]
    fn test_回文零() {
        assert_eq!(0.is_palindrome(), true);
    }
    #[test]
    fn test_回文非() {
        assert_eq!((-1).is_palindrome(), false);
    }
    #[test]
    fn test_回文字符串() {
        assert_eq!("12321".to_string().is_palindrome(), true);
        assert_eq!("123".to_string().is_palindrome(), false);
        assert_eq!("".to_string().is_palindrome(), true);
    }
}