// init構文の包括的テスト

// 1. 基本的なinit構文
box Animal {
    init { name, age }
    
    init(animalName, animalAge) {
        me.name = animalName
        me.age = animalAge
    }
    
    speak() {
        return me.name + " (age " + me.age + ") makes a sound"
    }
}

// 2. fromデリゲーションでのinit
box Dog from Animal {
    init { breed }
    
    init(dogName, dogAge, dogBreed) {
        from Animal.init(dogName, dogAge)  // 親のinitを呼び出し
        me.breed = dogBreed
    }
    
    override speak() {
        return me.name + " (age " + me.age + ", " + me.breed + ") barks: Woof!"
    }
}

// 3. 従来のBox名形式（互換性確認）
box Cat from Animal {
    init { color }
    
    Cat(catName, catAge, catColor) {  // 従来形式もまだ動作する
        from Animal.init(catName, catAge)
        me.color = catColor
    }
    
    override speak() {
        return me.name + " (age " + me.age + ", " + me.color + ") meows: Meow!"
    }
}

// テスト実行
print("=== init構文テスト ===")

// 1. 基本的なinit
local animal
animal = new Animal("Generic", 5)
print("Animal: " + animal.speak())

// 2. デリゲーションでのinit
local dog
dog = new Dog("Buddy", 3, "Golden Retriever")
print("Dog: " + dog.speak())

// 3. 従来形式との互換性
local cat
cat = new Cat("Whiskers", 2, "Black")
print("Cat: " + cat.speak())

// 4. 引数なしinit
box SimpleBox {
    init { value }
    
    init() {  // 引数なしinit
        me.value = "Default value"
    }
    
    getValue() {
        return me.value
    }
}

local simple
simple = new SimpleBox()
print("SimpleBox: " + simple.getValue())

print("\n✅ init構文テスト完了！")