/*
 * test_entity.cj - 实体映射测试
 */

package tybb2026::tycj_orm

import std.unittest.*

// ============================================================================
// 实体元数据测试
// ============================================================================

@test
func testEntityMetadataBasic(): Unit {
    let metadata = EntityMetadata(tableName: "users")

    assert(metadata.tableName == "users")
    assert(metadata.fieldMappings.isEmpty())
    assert(metadata.idField == "")
}

@test
func testAddFieldMapping(): Unit {
    let metadata = EntityMetadata(tableName: "users")

    metadata.addFieldMapping("userName", "user_name")
    metadata.addFieldMapping("email", "email_address")

    assert(metadata.fieldMappings.size == 2)
}

@test
func testGetColumnName(): Unit {
    let metadata = EntityMetadata(tableName: "users")
    metadata.addFieldMapping("userName", "user_name")

    let colOpt = metadata.getColumnName("userName")
    assert(colOpt.isSome())

    match (colOpt) {
        case Some(col) => assert(col == "user_name")
        case None => assert(false)
    }

    let notFoundOpt = metadata.getColumnName("nonExistent")
    assert(notFoundOpt.isNone())
}

@test
func testGetFieldNames(): Unit {
    let metadata = EntityMetadata(tableName: "users")
    metadata.addFieldMapping("userName", "user_name")
    metadata.addFieldMapping("email", "email_address")

    let fields = metadata.getFieldNames()
    assert(fields.size == 2)
}

@test
func testGetColumnNames(): Unit {
    let metadata = EntityMetadata(tableName: "users")
    metadata.addFieldMapping("userName", "user_name")
    metadata.addFieldMapping("email", "email_address")

    let columns = metadata.getColumnNames()
    assert(columns.size == 2)
}

// ============================================================================
// 注解测试
// ============================================================================

@test
func testEntityAnnotation(): Unit {
    // Entity 是一个抽象类,用于标记实体
    // 这里主要验证类存在且可以实例化(虽然不能直接实例化抽象类)
    assert(true) // 如果能编译通过,说明注解定义正确
}

@test
func testTableAnnotation(): Unit {
    let table = Table(name: "users")

    assert(table.name == "users")
}

@test
func testColumnAnnotation(): Unit {
    let column = Column(name: "user_name")

    assert(column.name == "user_name")
}

@test
func testIdAnnotation(): Unit {
    // Id 是一个抽象类,用于标记主键
    assert(true) // 如果能编译通过,说明注解定义正确
}

@test
func testTransientAnnotation(): Unit {
    // Transient 是一个抽象类,用于标记非持久化字段
    assert(true) // 如果能编译通过,说明注解定义正确
}