/// <reference path="../../node_modules/@types/jasmine/index.d.ts" />

import { MapIterator } from "../../src/util/iterator";

describe('param map iterator : ', () => {
    it("sur undefined (1)", () => {
        const it: MapIterator<any> = new MapIterator(undefined);

        const v1 = it.next();
        expect(v1.done).toBeTruthy();
        expect(v1.value).toBeUndefined();
        expect(it.key).toBeUndefined();
        expect(it.index).toBeUndefined();

        const v2 = it.next();
        expect(v2.done).toBeTruthy();
        expect(v2.value).toBeUndefined();
        expect(it.key).toBeUndefined();
        expect(it.index).toBeUndefined();
    });

    it("sur undefined (2)", () => {
        const it: MapIterator<any> = new MapIterator(undefined);
        let n = 0;
        for (let e of it)
            n++;

        expect(n).toEqual(0);
    });

    it("sur {}", () => {
        const it: MapIterator<any> = new MapIterator({});

        const v1 = it.next();
        expect(v1.done).toBeTruthy();
        expect(v1.value).toBeUndefined();
        expect(it.key).toBeUndefined();
        expect(it.index).toBeUndefined();

        const v2 = it.next();
        expect(v2.done).toBeTruthy();
        expect(v2.value).toBeUndefined();
        expect(it.key).toBeUndefined();
        expect(it.index).toBeUndefined();
    });

    it("sur {} (2)", () => {
        const it: MapIterator<any> = new MapIterator({});
        let n = 0;
        for (let e of it)
            n++;

        expect(n).toEqual(0);
    });

    it("sur {'a':1} (1)", () => {
        const o = { "a": 1 };
        const it: MapIterator<number> = new MapIterator(o);

        const v1 = it.next();
        expect(v1.done).toBeFalsy();
        expect(v1.value).toEqual(1);
        expect(it.key).toEqual("a");
        expect(it.index).toEqual(0);

        const v2 = it.next();
        expect(v2.done).toBeTruthy();
        expect(v2.value).toBeUndefined();
        expect(it.key).toBeUndefined();
        expect(it.index).toBeUndefined();
    });

    it("sur {'a':1} (2)", () => {
        const o = { "a": 1 };
        const it: MapIterator<any> = new MapIterator(o);
        let n = 0;
        for (let e of it) {
            n++;
            expect(e).toEqual(n);
        }

        expect(n).toEqual(1);
    });

    it("sur {'a':1, 'b':2} (1)", () => {
        const o = { "a": 1, "b": 2 };
        const it: MapIterator<number> = new MapIterator(o);

        const v1 = it.next();
        expect(v1.done).toBeFalsy();
        expect(v1.value).toEqual(1);
        expect(it.key).toEqual("a");

        const v2 = it.next();
        expect(v2.done).toBeFalsy();
        expect(v2.value).toEqual(2);
        expect(it.key).toEqual("b");

        const v3 = it.next();
        expect(v3.done).toBeTruthy();
        expect(v3.value).toBeUndefined();
        expect(it.key).toBeUndefined();
        expect(it.index).toBeUndefined();
    });

    it("sur {'a':1, 'b':2} (2)", () => {
        const o = { 'a': 1, 'b': 2 };
        const it: MapIterator<any> = new MapIterator(o);
        let n = 0;
        for (let e of it) {
            n++;
            expect(e).toEqual(n);
        }

        expect(n).toEqual(2);
    });
});