Path: blob/main/src/vs/base/test/browser/ui/grid/grid.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { createSerializedGrid, Direction, getRelativeLocation, Grid, GridNode, GridNodeDescriptor, ISerializableView, isGridBranchNode, IViewDeserializer, Orientation, sanitizeGridNodeDescriptor, SerializableGrid, Sizing } from '../../../../browser/ui/grid/grid.js';7import { Event } from '../../../../common/event.js';8import { deepClone } from '../../../../common/objects.js';9import { nodesToArrays, TestView } from './util.js';10import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../common/utils.js';11import { DisposableStore } from '../../../../common/lifecycle.js';1213// Simple example:14//15// +-----+---------------+16// | 4 | 2 |17// +-----+---------+-----+18// | 1 | |19// +---------------+ 3 |20// | 5 | |21// +---------------+-----+22//23// V24// +-H25// | +-426// | +-227// +-H28// +-V29// | +-130// | +-531// +-33233suite('Grid', function () {3435const store = ensureNoDisposablesAreLeakedInTestSuite();36let container: HTMLElement;3738setup(function () {39container = document.createElement('div');40container.style.position = 'absolute';41container.style.width = `${800}px`;42container.style.height = `${600}px`;43});4445test('getRelativeLocation', () => {46assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [0], Direction.Up), [0]);47assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [0], Direction.Down), [1]);48assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [0], Direction.Left), [0, 0]);49assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [0], Direction.Right), [0, 1]);5051assert.deepStrictEqual(getRelativeLocation(Orientation.HORIZONTAL, [0], Direction.Up), [0, 0]);52assert.deepStrictEqual(getRelativeLocation(Orientation.HORIZONTAL, [0], Direction.Down), [0, 1]);53assert.deepStrictEqual(getRelativeLocation(Orientation.HORIZONTAL, [0], Direction.Left), [0]);54assert.deepStrictEqual(getRelativeLocation(Orientation.HORIZONTAL, [0], Direction.Right), [1]);5556assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [4], Direction.Up), [4]);57assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [4], Direction.Down), [5]);58assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [4], Direction.Left), [4, 0]);59assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [4], Direction.Right), [4, 1]);6061assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [0, 0], Direction.Up), [0, 0, 0]);62assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [0, 0], Direction.Down), [0, 0, 1]);63assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [0, 0], Direction.Left), [0, 0]);64assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [0, 0], Direction.Right), [0, 1]);6566assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [1, 2], Direction.Up), [1, 2, 0]);67assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [1, 2], Direction.Down), [1, 2, 1]);68assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [1, 2], Direction.Left), [1, 2]);69assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [1, 2], Direction.Right), [1, 3]);7071assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [1, 2, 3], Direction.Up), [1, 2, 3]);72assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [1, 2, 3], Direction.Down), [1, 2, 4]);73assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [1, 2, 3], Direction.Left), [1, 2, 3, 0]);74assert.deepStrictEqual(getRelativeLocation(Orientation.VERTICAL, [1, 2, 3], Direction.Right), [1, 2, 3, 1]);75});7677test('empty', () => {78const view1 = store.add(new TestView(100, Number.MAX_VALUE, 100, Number.MAX_VALUE));79const gridview = store.add(new Grid(view1));80container.appendChild(gridview.element);81gridview.layout(800, 600);8283assert.deepStrictEqual(view1.size, [800, 600]);84});8586test('two views vertically', function () {87const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));88const grid = store.add(new Grid(view1));89container.appendChild(grid.element);90grid.layout(800, 600);91assert.deepStrictEqual(view1.size, [800, 600]);9293const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));94grid.addView(view2, 200, view1, Direction.Up);95assert.deepStrictEqual(view1.size, [800, 400]);96assert.deepStrictEqual(view2.size, [800, 200]);97});9899test('two views horizontally', function () {100const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));101const grid = store.add(new Grid(view1));102container.appendChild(grid.element);103104grid.layout(800, 600);105assert.deepStrictEqual(view1.size, [800, 600]);106107const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));108grid.addView(view2, 300, view1, Direction.Right);109assert.deepStrictEqual(view1.size, [500, 600]);110assert.deepStrictEqual(view2.size, [300, 600]);111});112113test('simple layout', function () {114const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));115const grid = store.add(new Grid(view1));116container.appendChild(grid.element);117118grid.layout(800, 600);119assert.deepStrictEqual(view1.size, [800, 600]);120121const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));122grid.addView(view2, 200, view1, Direction.Up);123assert.deepStrictEqual(view1.size, [800, 400]);124assert.deepStrictEqual(view2.size, [800, 200]);125126const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));127grid.addView(view3, 200, view1, Direction.Right);128assert.deepStrictEqual(view1.size, [600, 400]);129assert.deepStrictEqual(view2.size, [800, 200]);130assert.deepStrictEqual(view3.size, [200, 400]);131132const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));133grid.addView(view4, 200, view2, Direction.Left);134assert.deepStrictEqual(view1.size, [600, 400]);135assert.deepStrictEqual(view2.size, [600, 200]);136assert.deepStrictEqual(view3.size, [200, 400]);137assert.deepStrictEqual(view4.size, [200, 200]);138139const view5 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));140grid.addView(view5, 100, view1, Direction.Down);141assert.deepStrictEqual(view1.size, [600, 300]);142assert.deepStrictEqual(view2.size, [600, 200]);143assert.deepStrictEqual(view3.size, [200, 400]);144assert.deepStrictEqual(view4.size, [200, 200]);145assert.deepStrictEqual(view5.size, [600, 100]);146});147148test('another simple layout with automatic size distribution', function () {149const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));150const grid = store.add(new Grid(view1));151container.appendChild(grid.element);152153grid.layout(800, 600);154assert.deepStrictEqual(view1.size, [800, 600]);155156const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));157grid.addView(view2, Sizing.Distribute, view1, Direction.Left);158assert.deepStrictEqual(view1.size, [400, 600]);159assert.deepStrictEqual(view2.size, [400, 600]);160161const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));162grid.addView(view3, Sizing.Distribute, view1, Direction.Right);163assert.deepStrictEqual(view1.size, [266, 600]);164assert.deepStrictEqual(view2.size, [266, 600]);165assert.deepStrictEqual(view3.size, [268, 600]);166167const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));168grid.addView(view4, Sizing.Distribute, view2, Direction.Down);169assert.deepStrictEqual(view1.size, [266, 600]);170assert.deepStrictEqual(view2.size, [266, 300]);171assert.deepStrictEqual(view3.size, [268, 600]);172assert.deepStrictEqual(view4.size, [266, 300]);173174const view5 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));175grid.addView(view5, Sizing.Distribute, view3, Direction.Up);176assert.deepStrictEqual(view1.size, [266, 600]);177assert.deepStrictEqual(view2.size, [266, 300]);178assert.deepStrictEqual(view3.size, [268, 300]);179assert.deepStrictEqual(view4.size, [266, 300]);180assert.deepStrictEqual(view5.size, [268, 300]);181182const view6 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));183grid.addView(view6, Sizing.Distribute, view3, Direction.Down);184assert.deepStrictEqual(view1.size, [266, 600]);185assert.deepStrictEqual(view2.size, [266, 300]);186assert.deepStrictEqual(view3.size, [268, 200]);187assert.deepStrictEqual(view4.size, [266, 300]);188assert.deepStrictEqual(view5.size, [268, 200]);189assert.deepStrictEqual(view6.size, [268, 200]);190});191192test('another simple layout with split size distribution', function () {193const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));194const grid = store.add(new Grid(view1));195container.appendChild(grid.element);196197grid.layout(800, 600);198assert.deepStrictEqual(view1.size, [800, 600]);199200const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));201grid.addView(view2, Sizing.Split, view1, Direction.Left);202assert.deepStrictEqual(view1.size, [400, 600]);203assert.deepStrictEqual(view2.size, [400, 600]);204205const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));206grid.addView(view3, Sizing.Split, view1, Direction.Right);207assert.deepStrictEqual(view1.size, [200, 600]);208assert.deepStrictEqual(view2.size, [400, 600]);209assert.deepStrictEqual(view3.size, [200, 600]);210211const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));212grid.addView(view4, Sizing.Split, view2, Direction.Down);213assert.deepStrictEqual(view1.size, [200, 600]);214assert.deepStrictEqual(view2.size, [400, 300]);215assert.deepStrictEqual(view3.size, [200, 600]);216assert.deepStrictEqual(view4.size, [400, 300]);217218const view5 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));219grid.addView(view5, Sizing.Split, view3, Direction.Up);220assert.deepStrictEqual(view1.size, [200, 600]);221assert.deepStrictEqual(view2.size, [400, 300]);222assert.deepStrictEqual(view3.size, [200, 300]);223assert.deepStrictEqual(view4.size, [400, 300]);224assert.deepStrictEqual(view5.size, [200, 300]);225226const view6 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));227grid.addView(view6, Sizing.Split, view3, Direction.Down);228assert.deepStrictEqual(view1.size, [200, 600]);229assert.deepStrictEqual(view2.size, [400, 300]);230assert.deepStrictEqual(view3.size, [200, 150]);231assert.deepStrictEqual(view4.size, [400, 300]);232assert.deepStrictEqual(view5.size, [200, 300]);233assert.deepStrictEqual(view6.size, [200, 150]);234});235236test('3/2 layout with split', function () {237const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));238const grid = store.add(new Grid(view1));239container.appendChild(grid.element);240241grid.layout(800, 600);242assert.deepStrictEqual(view1.size, [800, 600]);243244const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));245grid.addView(view2, Sizing.Split, view1, Direction.Down);246assert.deepStrictEqual(view1.size, [800, 300]);247assert.deepStrictEqual(view2.size, [800, 300]);248249const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));250grid.addView(view3, Sizing.Split, view2, Direction.Right);251assert.deepStrictEqual(view1.size, [800, 300]);252assert.deepStrictEqual(view2.size, [400, 300]);253assert.deepStrictEqual(view3.size, [400, 300]);254255const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));256grid.addView(view4, Sizing.Split, view1, Direction.Right);257assert.deepStrictEqual(view1.size, [400, 300]);258assert.deepStrictEqual(view2.size, [400, 300]);259assert.deepStrictEqual(view3.size, [400, 300]);260assert.deepStrictEqual(view4.size, [400, 300]);261262const view5 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));263grid.addView(view5, Sizing.Split, view1, Direction.Right);264assert.deepStrictEqual(view1.size, [200, 300]);265assert.deepStrictEqual(view2.size, [400, 300]);266assert.deepStrictEqual(view3.size, [400, 300]);267assert.deepStrictEqual(view4.size, [400, 300]);268assert.deepStrictEqual(view5.size, [200, 300]);269});270271test('sizing should be correct after branch demotion #50564', function () {272const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));273const grid = store.add(new Grid(view1));274container.appendChild(grid.element);275276grid.layout(800, 600);277278const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));279grid.addView(view2, Sizing.Split, view1, Direction.Right);280281const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));282grid.addView(view3, Sizing.Split, view2, Direction.Down);283284const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));285grid.addView(view4, Sizing.Split, view2, Direction.Right);286assert.deepStrictEqual(view1.size, [400, 600]);287assert.deepStrictEqual(view2.size, [200, 300]);288assert.deepStrictEqual(view3.size, [400, 300]);289assert.deepStrictEqual(view4.size, [200, 300]);290291grid.removeView(view3);292assert.deepStrictEqual(view1.size, [400, 600]);293assert.deepStrictEqual(view2.size, [200, 600]);294assert.deepStrictEqual(view4.size, [200, 600]);295});296297test('sizing should be correct after branch demotion #50675', function () {298const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));299const grid = store.add(new Grid(view1));300container.appendChild(grid.element);301302grid.layout(800, 600);303304const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));305grid.addView(view2, Sizing.Distribute, view1, Direction.Down);306307const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));308grid.addView(view3, Sizing.Distribute, view2, Direction.Down);309310const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));311grid.addView(view4, Sizing.Distribute, view3, Direction.Right);312assert.deepStrictEqual(view1.size, [800, 200]);313assert.deepStrictEqual(view2.size, [800, 200]);314assert.deepStrictEqual(view3.size, [400, 200]);315assert.deepStrictEqual(view4.size, [400, 200]);316317grid.removeView(view3, Sizing.Distribute);318assert.deepStrictEqual(view1.size, [800, 200]);319assert.deepStrictEqual(view2.size, [800, 200]);320assert.deepStrictEqual(view4.size, [800, 200]);321});322323test('getNeighborViews should work on single view layout', function () {324const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));325const grid = store.add(new Grid(view1));326container.appendChild(grid.element);327328grid.layout(800, 600);329330assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Up), []);331assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Right), []);332assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Down), []);333assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Left), []);334335assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Up, true), [view1]);336assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Right, true), [view1]);337assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Down, true), [view1]);338assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Left, true), [view1]);339});340341test('getNeighborViews should work on simple layout', function () {342const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));343const grid = store.add(new Grid(view1));344container.appendChild(grid.element);345346grid.layout(800, 600);347348const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));349grid.addView(view2, Sizing.Distribute, view1, Direction.Down);350351const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));352grid.addView(view3, Sizing.Distribute, view2, Direction.Down);353354assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Up), []);355assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Right), []);356assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Down), [view2]);357assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Left), []);358359assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Up, true), [view3]);360assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Right, true), [view1]);361assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Down, true), [view2]);362assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Left, true), [view1]);363364assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Up), [view1]);365assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Right), []);366assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Down), [view3]);367assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Left), []);368369assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Up, true), [view1]);370assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Right, true), [view2]);371assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Down, true), [view3]);372assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Left, true), [view2]);373374assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Up), [view2]);375assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Right), []);376assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Down), []);377assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Left), []);378379assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Up, true), [view2]);380assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Right, true), [view3]);381assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Down, true), [view1]);382assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Left, true), [view3]);383});384385test('getNeighborViews should work on a complex layout', function () {386const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));387const grid = store.add(new Grid(view1));388container.appendChild(grid.element);389390grid.layout(800, 600);391392const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));393grid.addView(view2, Sizing.Distribute, view1, Direction.Down);394395const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));396grid.addView(view3, Sizing.Distribute, view2, Direction.Down);397398const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));399grid.addView(view4, Sizing.Distribute, view2, Direction.Right);400401const view5 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));402grid.addView(view5, Sizing.Distribute, view4, Direction.Down);403404assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Up), []);405assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Right), []);406assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Down), [view2, view4]);407assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Left), []);408assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Up), [view1]);409assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Right), [view4, view5]);410assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Down), [view3]);411assert.deepStrictEqual(grid.getNeighborViews(view2, Direction.Left), []);412assert.deepStrictEqual(grid.getNeighborViews(view4, Direction.Up), [view1]);413assert.deepStrictEqual(grid.getNeighborViews(view4, Direction.Right), []);414assert.deepStrictEqual(grid.getNeighborViews(view4, Direction.Down), [view5]);415assert.deepStrictEqual(grid.getNeighborViews(view4, Direction.Left), [view2]);416assert.deepStrictEqual(grid.getNeighborViews(view5, Direction.Up), [view4]);417assert.deepStrictEqual(grid.getNeighborViews(view5, Direction.Right), []);418assert.deepStrictEqual(grid.getNeighborViews(view5, Direction.Down), [view3]);419assert.deepStrictEqual(grid.getNeighborViews(view5, Direction.Left), [view2]);420assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Up), [view2, view5]);421assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Right), []);422assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Down), []);423assert.deepStrictEqual(grid.getNeighborViews(view3, Direction.Left), []);424});425426test('getNeighborViews should work on another simple layout', function () {427const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));428const grid = store.add(new Grid(view1));429container.appendChild(grid.element);430431grid.layout(800, 600);432433const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));434grid.addView(view2, Sizing.Distribute, view1, Direction.Right);435436const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));437grid.addView(view3, Sizing.Distribute, view2, Direction.Down);438439const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));440grid.addView(view4, Sizing.Distribute, view2, Direction.Right);441442assert.deepStrictEqual(grid.getNeighborViews(view4, Direction.Up), []);443assert.deepStrictEqual(grid.getNeighborViews(view4, Direction.Right), []);444assert.deepStrictEqual(grid.getNeighborViews(view4, Direction.Down), [view3]);445assert.deepStrictEqual(grid.getNeighborViews(view4, Direction.Left), [view2]);446});447448test('getNeighborViews should only return immediate neighbors', function () {449const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));450const grid = store.add(new Grid(view1));451container.appendChild(grid.element);452453grid.layout(800, 600);454455const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));456grid.addView(view2, Sizing.Distribute, view1, Direction.Right);457458const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));459grid.addView(view3, Sizing.Distribute, view2, Direction.Down);460461const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));462grid.addView(view4, Sizing.Distribute, view2, Direction.Right);463464assert.deepStrictEqual(grid.getNeighborViews(view1, Direction.Right), [view2, view3]);465});466467test('hiding splitviews and restoring sizes', function () {468const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));469const grid = store.add(new Grid(view1));470container.appendChild(grid.element);471472grid.layout(800, 600);473474const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));475grid.addView(view2, Sizing.Distribute, view1, Direction.Right);476477const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));478grid.addView(view3, Sizing.Distribute, view2, Direction.Down);479480const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));481grid.addView(view4, Sizing.Distribute, view2, Direction.Right);482483const size1 = view1.size;484const size2 = view2.size;485const size3 = view3.size;486const size4 = view4.size;487488grid.maximizeView(view1);489490// Views 2, 3, 4 are hidden491// Splitview (2,4) and ((2,4),3) are hidden492assert.deepStrictEqual(view1.size, [800, 600]);493assert.deepStrictEqual(view2.size, [0, 0]);494assert.deepStrictEqual(view3.size, [0, 0]);495assert.deepStrictEqual(view4.size, [0, 0]);496497grid.exitMaximizedView();498499assert.deepStrictEqual(view1.size, size1);500assert.deepStrictEqual(view2.size, size2);501assert.deepStrictEqual(view3.size, size3);502assert.deepStrictEqual(view4.size, size4);503504// Views 1, 3, 4 are hidden505// All splitviews are still visible => only orthogonalsize is 0506grid.maximizeView(view2);507508assert.deepStrictEqual(view1.size, [0, 600]);509assert.deepStrictEqual(view2.size, [800, 600]);510assert.deepStrictEqual(view3.size, [800, 0]);511assert.deepStrictEqual(view4.size, [0, 600]);512513grid.exitMaximizedView();514515assert.deepStrictEqual(view1.size, size1);516assert.deepStrictEqual(view2.size, size2);517assert.deepStrictEqual(view3.size, size3);518assert.deepStrictEqual(view4.size, size4);519});520521test('hasMaximizedView', function () {522const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));523const grid = store.add(new Grid(view1));524container.appendChild(grid.element);525526grid.layout(800, 600);527528const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));529grid.addView(view2, Sizing.Distribute, view1, Direction.Right);530531const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));532grid.addView(view3, Sizing.Distribute, view2, Direction.Down);533534const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));535grid.addView(view4, Sizing.Distribute, view2, Direction.Right);536537function checkIsMaximized(view: TestView) {538grid.maximizeView(view);539540assert.deepStrictEqual(grid.hasMaximizedView(), true);541542// When a view is maximized, no view can be expanded even if it is maximized543assert.deepStrictEqual(grid.isViewExpanded(view1), false);544assert.deepStrictEqual(grid.isViewExpanded(view2), false);545assert.deepStrictEqual(grid.isViewExpanded(view3), false);546assert.deepStrictEqual(grid.isViewExpanded(view4), false);547548grid.exitMaximizedView();549550assert.deepStrictEqual(grid.hasMaximizedView(), false);551}552553checkIsMaximized(view1);554checkIsMaximized(view2);555checkIsMaximized(view3);556checkIsMaximized(view4);557});558559test('Changes to the grid unmaximize the view', function () {560const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));561const grid = store.add(new Grid(view1));562container.appendChild(grid.element);563564grid.layout(800, 600);565566const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));567grid.addView(view2, Sizing.Distribute, view1, Direction.Right);568569const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));570grid.addView(view3, Sizing.Distribute, view2, Direction.Down);571572const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));573574// Adding a view unmaximizes the view575grid.maximizeView(view1);576assert.deepStrictEqual(grid.hasMaximizedView(), true);577grid.addView(view4, Sizing.Distribute, view2, Direction.Right);578579assert.deepStrictEqual(grid.hasMaximizedView(), false);580assert.deepStrictEqual(grid.isViewVisible(view1), true);581assert.deepStrictEqual(grid.isViewVisible(view2), true);582assert.deepStrictEqual(grid.isViewVisible(view3), true);583assert.deepStrictEqual(grid.isViewVisible(view4), true);584585// Removing a view unmaximizes the view586grid.maximizeView(view1);587assert.deepStrictEqual(grid.hasMaximizedView(), true);588grid.removeView(view4);589590assert.deepStrictEqual(grid.hasMaximizedView(), false);591assert.deepStrictEqual(grid.isViewVisible(view1), true);592assert.deepStrictEqual(grid.isViewVisible(view2), true);593assert.deepStrictEqual(grid.isViewVisible(view3), true);594595// Changing the visibility of any view while a view is maximized, unmaximizes the view596grid.maximizeView(view1);597assert.deepStrictEqual(grid.hasMaximizedView(), true);598grid.setViewVisible(view3, true);599600assert.deepStrictEqual(grid.hasMaximizedView(), false);601assert.deepStrictEqual(grid.isViewVisible(view1), true);602assert.deepStrictEqual(grid.isViewVisible(view2), true);603assert.deepStrictEqual(grid.isViewVisible(view3), true);604});605606test('Changes to the grid sizing unmaximize the view', function () {607const view1 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));608const grid = store.add(new Grid(view1));609container.appendChild(grid.element);610611grid.layout(800, 600);612613const view2 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));614grid.addView(view2, Sizing.Distribute, view1, Direction.Right);615616const view3 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));617grid.addView(view3, Sizing.Distribute, view2, Direction.Down);618619const view4 = store.add(new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE));620grid.addView(view4, Sizing.Distribute, view2, Direction.Right);621622// Maximizing a different view unmaximizes the current one and maximizes the new one623grid.maximizeView(view1);624assert.deepStrictEqual(grid.hasMaximizedView(), true);625grid.maximizeView(view2);626627assert.deepStrictEqual(grid.hasMaximizedView(), true);628assert.deepStrictEqual(grid.isViewVisible(view1), false);629assert.deepStrictEqual(grid.isViewVisible(view2), true);630assert.deepStrictEqual(grid.isViewVisible(view3), false);631assert.deepStrictEqual(grid.isViewVisible(view4), false);632633// Distributing the size unmaximizes the view634grid.maximizeView(view1);635assert.deepStrictEqual(grid.hasMaximizedView(), true);636grid.distributeViewSizes();637638assert.deepStrictEqual(grid.hasMaximizedView(), false);639assert.deepStrictEqual(grid.isViewVisible(view1), true);640assert.deepStrictEqual(grid.isViewVisible(view2), true);641assert.deepStrictEqual(grid.isViewVisible(view3), true);642assert.deepStrictEqual(grid.isViewVisible(view4), true);643644// Expanding a different view unmaximizes the view645grid.maximizeView(view1);646assert.deepStrictEqual(grid.hasMaximizedView(), true);647grid.expandView(view2);648649assert.deepStrictEqual(grid.hasMaximizedView(), false);650assert.deepStrictEqual(grid.isViewVisible(view1), true);651assert.deepStrictEqual(grid.isViewVisible(view2), true);652assert.deepStrictEqual(grid.isViewVisible(view3), true);653assert.deepStrictEqual(grid.isViewVisible(view4), true);654655// Expanding the maximized view unmaximizes the view656grid.maximizeView(view1);657assert.deepStrictEqual(grid.hasMaximizedView(), true);658grid.expandView(view1);659660assert.deepStrictEqual(grid.hasMaximizedView(), false);661assert.deepStrictEqual(grid.isViewVisible(view1), true);662assert.deepStrictEqual(grid.isViewVisible(view2), true);663assert.deepStrictEqual(grid.isViewVisible(view3), true);664assert.deepStrictEqual(grid.isViewVisible(view4), true);665});666});667668class TestSerializableView extends TestView implements ISerializableView {669670constructor(671readonly name: string,672minimumWidth: number,673maximumWidth: number,674minimumHeight: number,675maximumHeight: number676) {677super(minimumWidth, maximumWidth, minimumHeight, maximumHeight);678}679680toJSON() {681return { name: this.name };682}683}684685class TestViewDeserializer implements IViewDeserializer<TestSerializableView> {686687private views = new Map<string, TestSerializableView>();688689constructor(private readonly store: Pick<DisposableStore, 'add'>) { }690691fromJSON(json: any): TestSerializableView {692const view = this.store.add(new TestSerializableView(json.name, 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));693this.views.set(json.name, view);694return view;695}696697getView(id: string): TestSerializableView {698const view = this.views.get(id);699if (!view) {700throw new Error('Unknown view');701}702return view;703}704}705706function nodesToNames(node: GridNode<TestSerializableView>): any {707if (isGridBranchNode(node)) {708return node.children.map(nodesToNames);709} else {710return node.view.name;711}712}713714suite('SerializableGrid', function () {715716const store = ensureNoDisposablesAreLeakedInTestSuite();717let container: HTMLElement;718719setup(function () {720container = document.createElement('div');721container.style.position = 'absolute';722container.style.width = `${800}px`;723container.style.height = `${600}px`;724});725726test('serialize empty', function () {727const view1 = store.add(new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));728const grid = store.add(new SerializableGrid(view1));729container.appendChild(grid.element);730grid.layout(800, 600);731732const actual = grid.serialize();733assert.deepStrictEqual(actual, {734orientation: 0,735width: 800,736height: 600,737root: {738type: 'branch',739data: [740{741type: 'leaf',742data: {743name: 'view1',744},745size: 600746}747],748size: 800749}750});751});752753test('serialize simple layout', function () {754const view1 = store.add(new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));755const grid = store.add(new SerializableGrid(view1));756container.appendChild(grid.element);757grid.layout(800, 600);758759const view2 = store.add(new TestSerializableView('view2', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));760grid.addView(view2, 200, view1, Direction.Up);761762const view3 = store.add(new TestSerializableView('view3', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));763grid.addView(view3, 200, view1, Direction.Right);764765const view4 = store.add(new TestSerializableView('view4', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));766grid.addView(view4, 200, view2, Direction.Left);767768const view5 = store.add(new TestSerializableView('view5', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));769grid.addView(view5, 100, view1, Direction.Down);770771assert.deepStrictEqual(grid.serialize(), {772orientation: 0,773width: 800,774height: 600,775root: {776type: 'branch',777data: [778{779type: 'branch',780data: [781{ type: 'leaf', data: { name: 'view4' }, size: 200 },782{ type: 'leaf', data: { name: 'view2' }, size: 600 }783],784size: 200785},786{787type: 'branch',788data: [789{790type: 'branch',791data: [792{ type: 'leaf', data: { name: 'view1' }, size: 300 },793{ type: 'leaf', data: { name: 'view5' }, size: 100 }794],795size: 600796},797{ type: 'leaf', data: { name: 'view3' }, size: 200 }798],799size: 400800}801],802size: 800803}804});805});806807test('deserialize empty', function () {808const view1 = store.add(new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));809const grid = store.add(new SerializableGrid(view1));810container.appendChild(grid.element);811grid.layout(800, 600);812813const json = grid.serialize();814grid.dispose();815816const deserializer = new TestViewDeserializer(store);817const grid2 = store.add(SerializableGrid.deserialize(json, deserializer));818grid2.layout(800, 600);819820assert.deepStrictEqual(nodesToNames(grid2.getViews()), ['view1']);821});822823test('deserialize simple layout', function () {824const view1 = store.add(new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));825const grid = store.add(new SerializableGrid(view1));826container.appendChild(grid.element);827828grid.layout(800, 600);829830const view2 = store.add(new TestSerializableView('view2', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));831grid.addView(view2, 200, view1, Direction.Up);832833const view3 = store.add(new TestSerializableView('view3', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));834grid.addView(view3, 200, view1, Direction.Right);835836const view4 = store.add(new TestSerializableView('view4', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));837grid.addView(view4, 200, view2, Direction.Left);838839const view5 = store.add(new TestSerializableView('view5', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));840grid.addView(view5, 100, view1, Direction.Down);841842const json = grid.serialize();843grid.dispose();844845const deserializer = new TestViewDeserializer(store);846const grid2 = store.add(SerializableGrid.deserialize(json, deserializer));847848const view1Copy = deserializer.getView('view1');849const view2Copy = deserializer.getView('view2');850const view3Copy = deserializer.getView('view3');851const view4Copy = deserializer.getView('view4');852const view5Copy = deserializer.getView('view5');853854assert.deepStrictEqual(nodesToArrays(grid2.getViews()), [[view4Copy, view2Copy], [[view1Copy, view5Copy], view3Copy]]);855856grid2.layout(800, 600);857858assert.deepStrictEqual(view1Copy.size, [600, 300]);859assert.deepStrictEqual(view2Copy.size, [600, 200]);860assert.deepStrictEqual(view3Copy.size, [200, 400]);861assert.deepStrictEqual(view4Copy.size, [200, 200]);862assert.deepStrictEqual(view5Copy.size, [600, 100]);863});864865test('deserialize simple layout with scaling', function () {866const view1 = store.add(new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));867const grid = store.add(new SerializableGrid(view1));868container.appendChild(grid.element);869870grid.layout(800, 600);871872const view2 = store.add(new TestSerializableView('view2', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));873grid.addView(view2, 200, view1, Direction.Up);874875const view3 = store.add(new TestSerializableView('view3', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));876grid.addView(view3, 200, view1, Direction.Right);877878const view4 = store.add(new TestSerializableView('view4', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));879grid.addView(view4, 200, view2, Direction.Left);880881const view5 = store.add(new TestSerializableView('view5', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));882grid.addView(view5, 100, view1, Direction.Down);883884const json = grid.serialize();885grid.dispose();886887const deserializer = new TestViewDeserializer(store);888const grid2 = store.add(SerializableGrid.deserialize(json, deserializer));889890const view1Copy = deserializer.getView('view1');891const view2Copy = deserializer.getView('view2');892const view3Copy = deserializer.getView('view3');893const view4Copy = deserializer.getView('view4');894const view5Copy = deserializer.getView('view5');895896grid2.layout(400, 800); // [/2, *4/3]897assert.deepStrictEqual(view1Copy.size, [300, 400]);898assert.deepStrictEqual(view2Copy.size, [300, 267]);899assert.deepStrictEqual(view3Copy.size, [100, 533]);900assert.deepStrictEqual(view4Copy.size, [100, 267]);901assert.deepStrictEqual(view5Copy.size, [300, 133]);902});903904test('deserialize 4 view layout (ben issue #2)', function () {905const view1 = store.add(new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));906const grid = store.add(new SerializableGrid(view1));907container.appendChild(grid.element);908grid.layout(800, 600);909910const view2 = store.add(new TestSerializableView('view2', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));911grid.addView(view2, Sizing.Split, view1, Direction.Down);912913const view3 = store.add(new TestSerializableView('view3', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));914grid.addView(view3, Sizing.Split, view2, Direction.Down);915916const view4 = store.add(new TestSerializableView('view4', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));917grid.addView(view4, Sizing.Split, view3, Direction.Right);918919const json = grid.serialize();920grid.dispose();921922const deserializer = new TestViewDeserializer(store);923const grid2 = store.add(SerializableGrid.deserialize(json, deserializer));924925const view1Copy = deserializer.getView('view1');926const view2Copy = deserializer.getView('view2');927const view3Copy = deserializer.getView('view3');928const view4Copy = deserializer.getView('view4');929930grid2.layout(800, 600);931932assert.deepStrictEqual(view1Copy.size, [800, 300]);933assert.deepStrictEqual(view2Copy.size, [800, 150]);934assert.deepStrictEqual(view3Copy.size, [400, 150]);935assert.deepStrictEqual(view4Copy.size, [400, 150]);936});937938test('deserialize 2 view layout (ben issue #3)', function () {939const view1 = store.add(new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));940const grid = store.add(new SerializableGrid(view1));941container.appendChild(grid.element);942943grid.layout(800, 600);944945const view2 = store.add(new TestSerializableView('view2', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));946grid.addView(view2, Sizing.Split, view1, Direction.Right);947948const json = grid.serialize();949grid.dispose();950951const deserializer = new TestViewDeserializer(store);952const grid2 = store.add(SerializableGrid.deserialize(json, deserializer));953954const view1Copy = deserializer.getView('view1');955const view2Copy = deserializer.getView('view2');956957grid2.layout(800, 600);958959assert.deepStrictEqual(view1Copy.size, [400, 600]);960assert.deepStrictEqual(view2Copy.size, [400, 600]);961});962963test('deserialize simple view layout #50609', function () {964const view1 = store.add(new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));965const grid = store.add(new SerializableGrid(view1));966container.appendChild(grid.element);967968grid.layout(800, 600);969970const view2 = store.add(new TestSerializableView('view2', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));971grid.addView(view2, Sizing.Split, view1, Direction.Right);972973const view3 = store.add(new TestSerializableView('view3', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));974grid.addView(view3, Sizing.Split, view2, Direction.Down);975976grid.removeView(view1, Sizing.Split);977978const json = grid.serialize();979grid.dispose();980981const deserializer = new TestViewDeserializer(store);982const grid2 = store.add(SerializableGrid.deserialize(json, deserializer));983984const view2Copy = deserializer.getView('view2');985const view3Copy = deserializer.getView('view3');986987grid2.layout(800, 600);988989assert.deepStrictEqual(view2Copy.size, [800, 300]);990assert.deepStrictEqual(view3Copy.size, [800, 300]);991});992993test('sanitizeGridNodeDescriptor', () => {994const nodeDescriptor: GridNodeDescriptor<any> = { groups: [{ size: 0.2 }, { size: 0.2 }, { size: 0.6, groups: [{}, {}] }] };995const nodeDescriptorCopy = deepClone(nodeDescriptor);996sanitizeGridNodeDescriptor(nodeDescriptorCopy, true);997assert.deepStrictEqual(nodeDescriptorCopy, { groups: [{ size: 0.2 }, { size: 0.2 }, { size: 0.6, groups: [{ size: 0.5 }, { size: 0.5 }] }] });998});9991000test('createSerializedGrid', () => {1001const gridDescriptor = { orientation: Orientation.VERTICAL, groups: [{ size: 0.2, data: 'a' }, { size: 0.2, data: 'b' }, { size: 0.6, groups: [{ data: 'c' }, { data: 'd' }] }] };1002const serializedGrid = createSerializedGrid(gridDescriptor);1003assert.deepStrictEqual(serializedGrid, {1004root: {1005type: 'branch',1006size: undefined,1007data: [1008{ type: 'leaf', size: 0.2, data: 'a' },1009{ type: 'leaf', size: 0.2, data: 'b' },1010{1011type: 'branch', size: 0.6, data: [1012{ type: 'leaf', size: 0.5, data: 'c' },1013{ type: 'leaf', size: 0.5, data: 'd' }1014]1015}1016]1017},1018orientation: Orientation.VERTICAL,1019width: 1,1020height: 11021});1022});10231024test('createSerializedGrid - issue #85601, should not allow single children groups', () => {1025const serializedGrid = createSerializedGrid({ orientation: Orientation.HORIZONTAL, groups: [{ groups: [{}, {}], size: 0.5 }, { groups: [{}], size: 0.5 }] });1026const views: ISerializableView[] = [];1027const deserializer = new class implements IViewDeserializer<ISerializableView> {1028fromJSON(): ISerializableView {1029const view: ISerializableView = {1030element: document.createElement('div'),1031layout: () => null,1032minimumWidth: 0,1033maximumWidth: Number.POSITIVE_INFINITY,1034minimumHeight: 0,1035maximumHeight: Number.POSITIVE_INFINITY,1036onDidChange: Event.None,1037toJSON: () => ({})1038};1039views.push(view);1040return view;1041}1042};10431044const grid = store.add(SerializableGrid.deserialize(serializedGrid, deserializer));1045assert.strictEqual(views.length, 3);10461047// should not throw1048grid.removeView(views[2]);1049});10501051test('from', () => {1052const createView = (): ISerializableView => ({1053element: document.createElement('div'),1054layout: () => null,1055minimumWidth: 0,1056maximumWidth: Number.POSITIVE_INFINITY,1057minimumHeight: 0,1058maximumHeight: Number.POSITIVE_INFINITY,1059onDidChange: Event.None,1060toJSON: () => ({})1061});10621063const a = createView();1064const b = createView();1065const c = createView();1066const d = createView();10671068const gridDescriptor = { orientation: Orientation.VERTICAL, groups: [{ size: 0.2, data: a }, { size: 0.2, data: b }, { size: 0.6, groups: [{ data: c }, { data: d }] }] };1069const grid = SerializableGrid.from(gridDescriptor);10701071assert.deepStrictEqual(nodesToArrays(grid.getViews()), [a, b, [c, d]]);1072grid.dispose();1073});10741075test('serialize should store visibility and previous size', function () {1076const view1 = store.add(new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));1077const grid = store.add(new SerializableGrid(view1));1078container.appendChild(grid.element);1079grid.layout(800, 600);10801081const view2 = store.add(new TestSerializableView('view2', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));1082grid.addView(view2, 200, view1, Direction.Up);10831084const view3 = store.add(new TestSerializableView('view3', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));1085grid.addView(view3, 200, view1, Direction.Right);10861087const view4 = store.add(new TestSerializableView('view4', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));1088grid.addView(view4, 200, view2, Direction.Left);10891090const view5 = store.add(new TestSerializableView('view5', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));1091grid.addView(view5, 100, view1, Direction.Down);10921093assert.deepStrictEqual(view1.size, [600, 300]);1094assert.deepStrictEqual(view2.size, [600, 200]);1095assert.deepStrictEqual(view3.size, [200, 400]);1096assert.deepStrictEqual(view4.size, [200, 200]);1097assert.deepStrictEqual(view5.size, [600, 100]);10981099grid.setViewVisible(view5, false);11001101assert.deepStrictEqual(view1.size, [600, 400]);1102assert.deepStrictEqual(view2.size, [600, 200]);1103assert.deepStrictEqual(view3.size, [200, 400]);1104assert.deepStrictEqual(view4.size, [200, 200]);1105assert.deepStrictEqual(view5.size, [600, 0]);11061107grid.setViewVisible(view5, true);11081109assert.deepStrictEqual(view1.size, [600, 300]);1110assert.deepStrictEqual(view2.size, [600, 200]);1111assert.deepStrictEqual(view3.size, [200, 400]);1112assert.deepStrictEqual(view4.size, [200, 200]);1113assert.deepStrictEqual(view5.size, [600, 100]);11141115grid.setViewVisible(view5, false);11161117assert.deepStrictEqual(view1.size, [600, 400]);1118assert.deepStrictEqual(view2.size, [600, 200]);1119assert.deepStrictEqual(view3.size, [200, 400]);1120assert.deepStrictEqual(view4.size, [200, 200]);1121assert.deepStrictEqual(view5.size, [600, 0]);11221123grid.setViewVisible(view5, false);11241125const json = grid.serialize();1126assert.deepStrictEqual(json, {1127orientation: 0,1128width: 800,1129height: 600,1130root: {1131type: 'branch',1132data: [1133{1134type: 'branch',1135data: [1136{ type: 'leaf', data: { name: 'view4' }, size: 200 },1137{ type: 'leaf', data: { name: 'view2' }, size: 600 }1138],1139size: 2001140},1141{1142type: 'branch',1143data: [1144{1145type: 'branch',1146data: [1147{ type: 'leaf', data: { name: 'view1' }, size: 400 },1148{ type: 'leaf', data: { name: 'view5' }, size: 100, visible: false }1149],1150size: 6001151},1152{ type: 'leaf', data: { name: 'view3' }, size: 200 }1153],1154size: 4001155}1156],1157size: 8001158}1159});11601161grid.dispose();11621163const deserializer = new TestViewDeserializer(store);1164const grid2 = store.add(SerializableGrid.deserialize(json, deserializer));11651166const view1Copy = deserializer.getView('view1');1167const view2Copy = deserializer.getView('view2');1168const view3Copy = deserializer.getView('view3');1169const view4Copy = deserializer.getView('view4');1170const view5Copy = deserializer.getView('view5');11711172assert.deepStrictEqual(nodesToArrays(grid2.getViews()), [[view4Copy, view2Copy], [[view1Copy, view5Copy], view3Copy]]);11731174grid2.layout(800, 600);1175assert.deepStrictEqual(view1Copy.size, [600, 400]);1176assert.deepStrictEqual(view2Copy.size, [600, 200]);1177assert.deepStrictEqual(view3Copy.size, [200, 400]);1178assert.deepStrictEqual(view4Copy.size, [200, 200]);1179assert.deepStrictEqual(view5Copy.size, [600, 0]);11801181assert.deepStrictEqual(grid2.isViewVisible(view1Copy), true);1182assert.deepStrictEqual(grid2.isViewVisible(view2Copy), true);1183assert.deepStrictEqual(grid2.isViewVisible(view3Copy), true);1184assert.deepStrictEqual(grid2.isViewVisible(view4Copy), true);1185assert.deepStrictEqual(grid2.isViewVisible(view5Copy), false);11861187grid2.setViewVisible(view5Copy, true);11881189assert.deepStrictEqual(view1Copy.size, [600, 300]);1190assert.deepStrictEqual(view2Copy.size, [600, 200]);1191assert.deepStrictEqual(view3Copy.size, [200, 400]);1192assert.deepStrictEqual(view4Copy.size, [200, 200]);1193assert.deepStrictEqual(view5Copy.size, [600, 100]);11941195assert.deepStrictEqual(grid2.isViewVisible(view1Copy), true);1196assert.deepStrictEqual(grid2.isViewVisible(view2Copy), true);1197assert.deepStrictEqual(grid2.isViewVisible(view3Copy), true);1198assert.deepStrictEqual(grid2.isViewVisible(view4Copy), true);1199assert.deepStrictEqual(grid2.isViewVisible(view5Copy), true);1200});12011202test('serialize should store visibility and previous size even for first leaf', function () {1203const view1 = store.add(new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));1204const grid = store.add(new SerializableGrid(view1));1205container.appendChild(grid.element);1206grid.layout(800, 600);12071208const view2 = store.add(new TestSerializableView('view2', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));1209grid.addView(view2, 200, view1, Direction.Up);12101211const view3 = store.add(new TestSerializableView('view3', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));1212grid.addView(view3, 200, view1, Direction.Right);12131214const view4 = store.add(new TestSerializableView('view4', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));1215grid.addView(view4, 200, view2, Direction.Left);12161217const view5 = store.add(new TestSerializableView('view5', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE));1218grid.addView(view5, 100, view1, Direction.Down);12191220assert.deepStrictEqual(view1.size, [600, 300]);1221assert.deepStrictEqual(view2.size, [600, 200]);1222assert.deepStrictEqual(view3.size, [200, 400]);1223assert.deepStrictEqual(view4.size, [200, 200]);1224assert.deepStrictEqual(view5.size, [600, 100]);12251226grid.setViewVisible(view4, false);12271228assert.deepStrictEqual(view1.size, [600, 300]);1229assert.deepStrictEqual(view2.size, [800, 200]);1230assert.deepStrictEqual(view3.size, [200, 400]);1231assert.deepStrictEqual(view4.size, [0, 200]);1232assert.deepStrictEqual(view5.size, [600, 100]);12331234const json = grid.serialize();1235assert.deepStrictEqual(json, {1236orientation: 0,1237width: 800,1238height: 600,1239root: {1240type: 'branch',1241data: [1242{1243type: 'branch',1244data: [1245{ type: 'leaf', data: { name: 'view4' }, size: 200, visible: false },1246{ type: 'leaf', data: { name: 'view2' }, size: 800 }1247],1248size: 2001249},1250{1251type: 'branch',1252data: [1253{1254type: 'branch',1255data: [1256{ type: 'leaf', data: { name: 'view1' }, size: 300 },1257{ type: 'leaf', data: { name: 'view5' }, size: 100 }1258],1259size: 6001260},1261{ type: 'leaf', data: { name: 'view3' }, size: 200 }1262],1263size: 4001264}1265],1266size: 8001267}1268});12691270grid.dispose();12711272const deserializer = new TestViewDeserializer(store);1273const grid2 = store.add(SerializableGrid.deserialize(json, deserializer));12741275const view1Copy = deserializer.getView('view1');1276const view2Copy = deserializer.getView('view2');1277const view3Copy = deserializer.getView('view3');1278const view4Copy = deserializer.getView('view4');1279const view5Copy = deserializer.getView('view5');12801281assert.deepStrictEqual(nodesToArrays(grid2.getViews()), [[view4Copy, view2Copy], [[view1Copy, view5Copy], view3Copy]]);12821283grid2.layout(800, 600);1284assert.deepStrictEqual(view1Copy.size, [600, 300]);1285assert.deepStrictEqual(view2Copy.size, [800, 200]);1286assert.deepStrictEqual(view3Copy.size, [200, 400]);1287assert.deepStrictEqual(view4Copy.size, [0, 200]);1288assert.deepStrictEqual(view5Copy.size, [600, 100]);12891290assert.deepStrictEqual(grid2.isViewVisible(view1Copy), true);1291assert.deepStrictEqual(grid2.isViewVisible(view2Copy), true);1292assert.deepStrictEqual(grid2.isViewVisible(view3Copy), true);1293assert.deepStrictEqual(grid2.isViewVisible(view4Copy), false);1294assert.deepStrictEqual(grid2.isViewVisible(view5Copy), true);12951296grid2.setViewVisible(view4Copy, true);12971298assert.deepStrictEqual(view1Copy.size, [600, 300]);1299assert.deepStrictEqual(view2Copy.size, [600, 200]);1300assert.deepStrictEqual(view3Copy.size, [200, 400]);1301assert.deepStrictEqual(view4Copy.size, [200, 200]);1302assert.deepStrictEqual(view5Copy.size, [600, 100]);13031304assert.deepStrictEqual(grid2.isViewVisible(view1Copy), true);1305assert.deepStrictEqual(grid2.isViewVisible(view2Copy), true);1306assert.deepStrictEqual(grid2.isViewVisible(view3Copy), true);1307assert.deepStrictEqual(grid2.isViewVisible(view4Copy), true);1308assert.deepStrictEqual(grid2.isViewVisible(view5Copy), true);1309});1310});131113121313