use ress::prelude::*;
#[test]
fn comment_handler1() {
    let js = "
/**
 * @param s {string} The string to trim
 * @returns {string}
 */
function trimString(s) {
    return s.trim();
}
";
    let mut docs = vec![];
    let ch = |comments: Item<&str>| {
        if let Token::Comment(comment) = comments.token {
            docs.push(comment.to_string())
        }
    };
    let _ = ressa::Parser::builder()
        .js(js)
        .with_comment_handler(ch)
        .expect("failed to create parser")
        .parse()
        .expect("failed to parse js");
    assert!(docs.len() == 1, "docs not updated for comment");
    assert_eq!(
        docs[0],
        "/**
 * @param s {string} The string to trim
 * @returns {string}
 */"
    );
}

#[test]
fn comment_handler2() {
    let js = "
/**
 * @param s {string} The string to trim
 * @returns {string}
 */
function trimString(s) {
    /**
     * @param s {string} The string to trim
     * @returns {string}
     */
    function trimStringInner(s) {
        return s.trim();
    }
    return trimStringInner(s);
}";
    let mut docs = vec![];
    let ch = |comments: Item<&str>| {
        if let Token::Comment(comment) = comments.token {
            docs.push(comment.to_string())
        }
    };
    let _ = ressa::Parser::builder()
        .js(js)
        .with_comment_handler(ch)
        .expect("failed to create parser")
        .parse()
        .expect("failed to parse js");
    assert!(docs.len() == 2, "docs not updated for comment");
    assert_eq!(
        docs[0],
        "/**
 * @param s {string} The string to trim
 * @returns {string}
 */"
    );
    assert_eq!(
        docs[1],
        "/**
     * @param s {string} The string to trim
     * @returns {string}
     */"
    );
}

#[test]
fn comment_handler3() {
    use ressa::CommentHandler;
    #[derive(Clone)]
    struct Ch {
        pub comments: Vec<(SourceLocation, String)>,
    }
    impl Ch {
        fn new() -> Self {
            Self { comments: vec![] }
        }
    }
    impl<'a> CommentHandler<'a> for Ch {
        fn handle_comment(&mut self, comment: Item<&'a str>) {
            let loc = comment.location;
            if let Token::Comment(comment) = comment.token {
                let s = comment.to_string();
                self.comments.push((loc, s))
            }
        }
    }
    let js = "
/**
 * @param s {string} The string to trim
 * @returns {string}
 */
function trimString(s) {
    /**
     * @param s {string} The string to trim
     * @returns {string}
     */
    function trimStringInner(s) {
        return s.trim();
    }
    return trimStringInner(s);
}";
    let ch = Ch::new();
    let mut p = ressa::Parser::builder()
        .js(js)
        .with_comment_handler(ch)
        .expect("failed to create parser");
    let _res = p.parse().expect("failed to parse js");
    assert_eq!(p.comment_handler.comments.len(), 2);
    assert_eq!(
        p.comment_handler.comments[0].1,
        "/**
 * @param s {string} The string to trim
 * @returns {string}
 */"
    );
    assert_eq!(
        p.comment_handler.comments[1].1,
        "/**
     * @param s {string} The string to trim
     * @returns {string}
     */"
    );
}
