use super::*;
use pretty_assertions::assert_eq;

#[test]
fn create_1() {
    assert_eq!(
        Index::create()
            .name("idx-glyph-aspect")
            .table(Glyph::Table)
            .col(Glyph::Aspect)
            .to_string(MysqlQueryBuilder),
        "CREATE INDEX `idx-glyph-aspect` ON `glyph` (`aspect`)"
    );
}

#[test]
fn create_2() {
    assert_eq!(
        Index::create()
            .unique()
            .name("idx-glyph-aspect-image")
            .table(Glyph::Table)
            .col(Glyph::Aspect)
            .col(Glyph::Image)
            .to_string(MysqlQueryBuilder),
        "CREATE UNIQUE INDEX `idx-glyph-aspect-image` ON `glyph` (`aspect`, `image`)"
    );
}

#[test]
fn create_3() {
    assert_eq!(
        Index::create()
            .full_text()
            .name("idx-glyph-image")
            .table(Glyph::Table)
            .col(Glyph::Image)
            .to_string(MysqlQueryBuilder),
        "CREATE FULLTEXT INDEX `idx-glyph-image` ON `glyph` (`image`)"
    );
}

#[test]
fn create_4() {
    assert_eq!(
        Index::create()
            .index_type(IndexType::Hash)
            .name("idx-glyph-image")
            .table(Glyph::Table)
            .col(Glyph::Image)
            .to_string(MysqlQueryBuilder),
        "CREATE INDEX `idx-glyph-image` ON `glyph` (`image`) USING HASH"
    );
}

#[test]
fn create_5() {
    assert_eq!(
        Index::create()
            .name("idx-character-area")
            .table(Character::Table)
            .col(Expr::col(Character::SizeH).mul(Expr::col(Character::SizeW)))
            .to_string(MysqlQueryBuilder),
        "CREATE INDEX `idx-character-area` ON `character` ((`size_h` * `size_w`))"
    )
}

#[test]
fn create_6() {
    assert_eq!(
        Index::create()
            .name("idx-character-character-area-desc-created_at")
            .table(Character::Table)
            .col(Func::upper(Expr::col(Character::Character)))
            .col((
                Expr::col(Character::SizeH).mul(Expr::col(Character::SizeW)),
                IndexOrder::Desc,
            ))
            .col(Character::CreatedAt)
            .to_string(MysqlQueryBuilder),
        "CREATE INDEX `idx-character-character-area-desc-created_at` ON `character` ((UPPER(`character`)), (`size_h` * `size_w`) DESC, `created_at`)"
    )
}

#[test]
fn create_7() {
    assert_eq!(
        Index::create()
            .unique()
            .name("idx-glyph-image-primary")
            .table(Glyph::Table)
            .col(Glyph::Image)
            .cond_where(Expr::col(Glyph::Aspect).is_not_null())
            .to_string(MysqlQueryBuilder),
        "CREATE UNIQUE INDEX `idx-glyph-image-primary` ON `glyph` (`image`) WHERE `aspect` IS NOT NULL"
    )
}

#[test]
fn drop_1() {
    assert_eq!(
        Index::drop()
            .name("idx-glyph-aspect")
            .table(Glyph::Table)
            .to_string(MysqlQueryBuilder),
        "DROP INDEX `idx-glyph-aspect` ON `glyph`"
    );
}
