/*
 * Copyright (c) 2010-2019 BSI Business Systems Integration AG.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     BSI Business Systems Integration AG - initial API and implementation
 */
import {arrays, TypeDescriptor} from '../src/index';

describe('ObjectInfo', function() {

  describe('parse', function() {

    it('parses objectType only - without namespace', function() {
      var info = TypeDescriptor.parse('StringField');
      expect(info.modelVariant).toBe(null);
      expect(info.objectType.name).toBe('StringField');
      expect(arrays.empty(info.objectType.namespaces)).toBe(true);
    });

    it('parses objectType only - with namespace', function() {
      var info = TypeDescriptor.parse('my.StringField');
      expect(info.modelVariant).toBe(null);
      expect(info.objectType.name).toBe('StringField');
      expect(info.objectType.namespaces).toEqual(['my']);
    });

    it('parses objectType and variant - without namespace', function() {
      var info = TypeDescriptor.parse('StringField:Variant');
      expect(info.modelVariant.name).toBe('Variant');
      expect(arrays.empty(info.modelVariant.namespaces)).toBe(true);
      expect(info.objectType.name).toBe('StringField');
      expect(arrays.empty(info.objectType.namespaces)).toBe(true);
    });

    it('parses objectType and variant - with namespace on objectType (model variant inherits namespace from object type)', function() {
      var info = TypeDescriptor.parse('my.StringField:Variant');
      expect(info.modelVariant.name).toBe('Variant');
      expect(info.modelVariant.namespaces).toEqual(['my']);
      expect(info.objectType.name).toBe('StringField');
      expect(info.objectType.namespaces).toEqual(['my']);
    });

    it('parses objectType and variant - different namespaces for model variant and  object type', function() {
      var info = TypeDescriptor.parse('my.StringField:your.Variant');
      expect(info.modelVariant.name).toBe('Variant');
      expect(info.modelVariant.namespaces).toEqual(['your']);
      expect(info.objectType.name).toBe('StringField');
      expect(info.objectType.namespaces).toEqual(['my']);
    });

    it('parses objectType with multiple nested namespaces', function() {
      var info = TypeDescriptor.parse('my.fair.StringField');
      expect(info.modelVariant).toBe(null);
      expect(info.objectType.name).toBe('StringField');
      expect(info.objectType.namespaces).toEqual(['my', 'fair']);
    });

  });

  describe('toString', function() {

    it('returns correct string', function() {
      var info = TypeDescriptor.parse('my.pretty.StringField:your.Variant');
      expect(info.objectType.toString()).toBe('my.pretty.StringField');
      expect(info.modelVariant.toString()).toBe('your.Variant');
    });

  });

});
