/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var main = require('..');

describe('main', function () {
    it('exists and has expected properties', function () {
        expect(main).toBeDefined();
        expect(main.Router).toBeDefined();
        expect(main.static).toBeDefined();
    });

    it('is creatable', function () {
        var instance = main();
        expect(instance.servePlatform).toBeDefined();
        expect(typeof instance.servePlatform).toBe('function');

        expect(instance.launchServer).toBeDefined();
        expect(typeof instance.launchServer).toBe('function');

        expect(instance.launchBrowser).toBeDefined();
        expect(typeof instance.launchBrowser).toBe('function');
    });
});
