/**
 * Created by Weizehua on 2017/1/13.
 */

import "reflect-metadata"
import {assert} from "chai"
import {suite, test} from "mocha-typescript"
import {Injectable, Injector, Singleton} from "../src/index";


@Injectable()
class A {
}

@Injectable()
class B {
    private val = '1234';

    constructor(private a: A) {
    }

    getVal() {
        return this.val;
    }

    setVal(newval) {
        this.val = newval;
    }
}

@Singleton()
class SingletonClass {
    private val = '1234';

    constructor(private a: A) {
    }

    get() {
        return this.val;
    }

    set(newval) {
        this.val = newval;
    }
}


@suite
class InjectorTest {
    @test static 'get @Injectable()'() {
        let b = Injector.get(B);
        assert.equal(b.getVal(), '1234');
    }

    @test static 'get @Singleton()'() {
        let b = Injector.get(SingletonClass);
        assert.equal(b.get(), '1234');
    }

    @test static 'different @Injectable() instance should reference to different object'() {
        let b = Injector.get(B);
        let b2 = Injector.get(B);
        let newVal = 'zzzz';
        b.setVal(newVal);
        assert.equal(b.getVal(), newVal);
        assert.equal(b2.getVal(), '1234');
    }

    @test static 'different @Singleton() instance should reference to the same object'() {
        let b = Injector.get(SingletonClass);
        let b2 = Injector.get(SingletonClass);
        let newVal = 'zzzz';
        b.set(newVal);
        assert.equal(b.get(), newVal);
        assert.equal(b2.get(), newVal);
    }
}
