use {
    gluesql_core::{
        error::{SchemaParseError, ValueError},
        prelude::{Error, Glue},
    },
    gluesql_json_storage::{JsonStorage, error::JsonStorageError},
};

#[tokio::test]
async fn json_error() {
    let path = "./tests/samples/";
    let json_storage = JsonStorage::new(path).unwrap();
    let mut glue = Glue::new(json_storage);

    let cases = vec![
        (
            glue.execute("SELECT * FROM WrongFormatJsonl").await,
            Err(ValueError::InvalidJsonString("[".to_owned()).into()),
        ),
        (
            glue.execute("SELECT * FROM WrongFormatJson").await,
            Err(Error::StorageMsg(
                JsonStorageError::InvalidJsonContent("WrongFormatJson.json".to_owned()).to_string(),
            )),
        ),
        (
            glue.execute("SELECT * FROM WrongSchema").await,
            Err(Error::Schema(SchemaParseError::CannotParseDDL)),
        ),
        (
            glue.execute("SELECT * FROM WrongTableName").await,
            Err(Error::StorageMsg(
                JsonStorageError::TableNameDoesNotMatchWithFile.to_string(),
            )),
        ),
        (
            glue.execute("SELECT * FROM Duplicated").await,
            Err(Error::StorageMsg(
                JsonStorageError::BothJsonlAndJsonExist("Duplicated".to_owned()).to_string(),
            )),
        ),
        (
            glue.execute("DROP TABLE Duplicated").await,
            Err(Error::StorageMsg(
                JsonStorageError::BothJsonlAndJsonExist("Duplicated".to_owned()).to_string(),
            )),
        ),
        (
            glue.execute("SELECT * FROM JsonObjectTypeRequired").await,
            Err(Error::StorageMsg(
                JsonStorageError::JsonObjectTypeRequired.to_string(),
            )),
        ),
        (
            glue.execute("SELECT * FROM JsonArrayTypeRequired").await,
            Err(Error::StorageMsg(
                JsonStorageError::JsonArrayTypeRequired.to_string(),
            )),
        ),
    ];

    for (actual, expected) in cases {
        assert_eq!(actual.map(|mut payloads| payloads.remove(0)), expected);
    }
}
