it('should return UNRECOGNIZED state when the schema is valid but values are incorect or incomplete', () => {
   expect(detectSelectionType([1])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([[1]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType(['prop1'])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([['prop1']])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType(range(1, 2))).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([[range(1, 2), range(1, 2)]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([[range(1, 2), range(1, 2), range(1, 2)]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([[range(1, 2), range(1, 2), range(1, 2), range(1, 2)]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
 });
 it('should ignore nested structures', () => {
   expect(detectSelectionType([[[1, 1]]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([[[1, 1, 2, 2]]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([[[[1, 1]]]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([[[[1, 1, 2, 2]]]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([[[[[1, 1]]]]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([[[[[1, 1, 2, 2]]]]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([[[[[range(1, 2), range(1, 2)]]]]])).toBe(SELECTION_TYPE_UNRECOGNIZED);
 });
 it('should return UNRECOGNIZED state when the schema is unrecognized', () => {
   expect(detectSelectionType(null)).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType(1)).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType('z')).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType(true)).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType([{}])).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType({})).toBe(SELECTION_TYPE_UNRECOGNIZED);
   expect(detectSelectionType()).toBe(SELECTION_TYPE_UNRECOGNIZED);
 });
 it('should return OBJECT state on valid range selection schema', () => {
   expect(detectSelectionType([range(1, 2)])).toBe(SELECTION_TYPE_OBJECT);
   expect(detectSelectionType([range(1, 2), range(1, 2)])).toBe(SELECTION_TYPE_OBJECT);
   expect(detectSelectionType([range(1, 2), range(1, 2), range(1, 2)])).toBe(SELECTION_TYPE_OBJECT);
   expect(detectSelectionType([range(1, 2), range(1, 2), range(1, 2), range(1, 2)])).toBe(SELECTION_TYPE_OBJECT);
 });
    it('should return ARRAY state on valid an array selection schema', () => {
      expect(detectSelectionType([1, 1])).toBe(SELECTION_TYPE_ARRAY);
      expect(detectSelectionType([1, 1, 2])).toBe(SELECTION_TYPE_ARRAY);
      expect(detectSelectionType([1, 1, 2, 2])).toBe(SELECTION_TYPE_ARRAY);
      expect(detectSelectionType([1, 'prop1'])).toBe(SELECTION_TYPE_ARRAY);
      expect(detectSelectionType([1, 'prop1', 2])).toBe(SELECTION_TYPE_ARRAY);
      expect(detectSelectionType([1, 'prop1', 2, 'prop2'])).toBe(SELECTION_TYPE_ARRAY);

      expect(detectSelectionType([[1, 1]])).toBe(SELECTION_TYPE_ARRAY);
      expect(detectSelectionType([[1, 1, 2]])).toBe(SELECTION_TYPE_ARRAY);
      expect(detectSelectionType([[1, 1, 2, 2]])).toBe(SELECTION_TYPE_ARRAY);
      expect(detectSelectionType([[1, 'prop1']])).toBe(SELECTION_TYPE_ARRAY);
      expect(detectSelectionType([[1, 'prop1', 2]])).toBe(SELECTION_TYPE_ARRAY);
      expect(detectSelectionType([[1, 'prop1', 2, 'prop2']])).toBe(SELECTION_TYPE_ARRAY);
    });
 it('should return EMPTY state when the passed data is empty', () => {
   expect(detectSelectionType([])).toBe(SELECTION_TYPE_EMPTY);
   expect(detectSelectionType([[]])).toBe(SELECTION_TYPE_EMPTY);
 });
 expect(() => detectSelectionType([1, 1], Symbol('child'))).toThrow();
 expect(() => detectSelectionType([1, 1], null)).toThrow();
 expect(() => detectSelectionType([1, 1], false)).toThrow();