// 🔥 FromCall実装テスト - Override + From統一構文によるデリゲーション革命

// 親クラス定義
box Animal {
    init { name, sound }
    
    constructor() {
        me.name = "Unknown Animal"
        me.sound = "Silent"
    }
    
    constructor(animalName) {
        me.name = animalName
        me.sound = "Unknown Sound"
    }
    
    makeSound() {
        local console
        console = new ConsoleBox()
        console.log(me.name + " makes " + me.sound)
        return me.sound
    }
    
    getName() {
        return me.name
    }
}

// 子クラス定義（デリゲーション関係）
box Dog : Animal {
    init { breed }
    
    constructor() {
        // 親コンストラクタを呼び出し
        from Animal.constructor()
        me.sound = "Woof!"
        me.breed = "Mixed"
    }
    
    constructor(dogName, dogBreed) {
        // 引数付き親コンストラクタを呼び出し
        from Animal.constructor(dogName)
        me.sound = "Woof!"
        me.breed = dogBreed
    }
    
    // override: 親メソッドをオーバーライド
    makeSound() {
        // 親メソッドを呼び出し
        local parentSound
        parentSound = from Animal.makeSound()
        
        // 追加の処理
        local console
        console = new ConsoleBox()
        console.log("This is a " + me.breed + " breed!")
        return parentSound
    }
    
    getBreed() {
        return me.breed
    }
    
    // 親のgetNameを呼び出すテスト
    getFullInfo() {
        local parentName
        parentName = from Animal.getName()
        return parentName + " (" + me.breed + ")"
    }
}

// 静的メインクラス
static box Main {
    init { console }
    
    main() {
        me.console = new ConsoleBox()
        me.console.log("🔥 FromCall Implementation Test Starting...")
        
        // テスト1: デフォルトコンストラクタ
        local dog1
        dog1 = new Dog()
        me.console.log("Test 1 - Default Constructor:")
        dog1.makeSound()
        me.console.log("Name: " + dog1.getName())
        me.console.log("Breed: " + dog1.getBreed())
        me.console.log("")
        
        // テスト2: 引数付きコンストラクタ
        local dog2
        dog2 = new Dog("Buddy", "Golden Retriever")
        me.console.log("Test 2 - Parameterized Constructor:")
        dog2.makeSound()
        me.console.log("Full Info: " + dog2.getFullInfo())
        me.console.log("")
        
        // テスト3: 親メソッド直接呼び出し
        me.console.log("Test 3 - Direct parent method call:")
        local directAnimal
        directAnimal = new Animal("Cat")
        directAnimal.makeSound()
        
        me.console.log("🎉 FromCall Implementation Test Completed!")
        return "FromCall Revolution Success!"
    }
}