
import {}           from '../types';
import { validate } from '../validator';
import { pick }     from '../picker';
import { picked,
         partial,
         intersect,
         oneOf,
         subtract,
         primitive,
         primitiveValue,
         optional,
         repeated,
         sequenceOf,
         spread,
         objectType,
         derived,
         withMsg as $$,
         withMsgId as $ } from '../operators';



describe("operator", function() {
    it("operator-1", function() {
        const myType = oneOf(
            derived(
                objectType(
                    ['foo', 10],
                    ['qoo', $$({valueUnmatched: ''})(
                            optional(20))],
                    ['zoo', $('msgid-myType-zoo')(
                            optional('aaa'))],
                    ['www', sequenceOf(10, 20, spread(primitive('string'), {min: 3, max: 10}), 50)],
                ),
                objectType(
                    ['bar', optional(primitive('string'))],
                    ['bar2', primitive('string?')],
                    ['bar3', repeated('string', {min: 3, max: 10})],
                    ['bar4', primitive('integer')],
                    ['bar5', primitive('integer?')],
                    [[/^[a-z][0-9]$/], optional(primitive('string'))],
                ),
                intersect(
                    objectType(
                        ['baz', 10],
                    ),
                    objectType(
                        ['baz', 10],
                    ),
                ),
                subtract(
                    objectType(
                        ['baz', 10],
                    ),
                    objectType(
                        ['baz', 10],
                    ),
                ),
            ),
            10, 20, 30,
            primitive('string'),
            primitiveValue(50),
        );

        expect(validate({
            foo: 10,
            www: [10, 20, 'a', 'b', 'c', 50],
            bar3: ['a', 'b', 'c'],
            bar4: 11,
            bar5: 13,
            baz: 10,
        }, myType)).toEqual({value: {
            foo: 10,
            www: [10, 20, 'a', 'b', 'c', 50],
            bar3: ['a', 'b', 'c'],
            bar4: 11,
            bar5: 13,
            baz: 10,
        }});

        /*
        console.log(JSON.stringify(myType, null, 2));

        const myType2 = picked(myType, 'foo', 'baz');
        console.log(JSON.stringify(myType2, null, 2));

        const myType3 = partial(myType);
        console.log(JSON.stringify(myType3, null, 2));

        expect(validate({
            aaaaaa: 'ppppppppppppp',
            foo: 10,
            www: [10, 20, 'a', 'b', 'c', 50],
            bar3: ['a', 'b', 'c'],
        }, myType)).toEqual({} as any);
        pick({}, myType2);
        merge({}, {});
        */

        expect(1).toEqual(1);
    });
});
