Path: blob/main/src/vs/base/test/browser/ui/grid/gridview.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 { $ } from '../../../../browser/dom.js';7import { GridView, IView, Orientation, Sizing } from '../../../../browser/ui/grid/gridview.js';8import { nodesToArrays, TestView } from './util.js';9import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../common/utils.js';1011suite('Gridview', function () {1213const store = ensureNoDisposablesAreLeakedInTestSuite();1415function createGridView(): GridView {16const gridview = store.add(new GridView());17const container = $('.container');1819container.style.position = 'absolute';20container.style.width = `${200}px`;21container.style.height = `${200}px`;22container.appendChild(gridview.element);2324return gridview;25}2627test('empty gridview is empty', function () {28const gridview = createGridView();29assert.deepStrictEqual(nodesToArrays(gridview.getView()), []);30});3132test('gridview addView', function () {33const gridview = createGridView();3435const view = store.add(new TestView(20, 20, 20, 20));36assert.throws(() => gridview.addView(view, 200, []), 'empty location');37assert.throws(() => gridview.addView(view, 200, [1]), 'index overflow');38assert.throws(() => gridview.addView(view, 200, [0, 0]), 'hierarchy overflow');3940const views = [41store.add(new TestView(20, 20, 20, 20)),42store.add(new TestView(20, 20, 20, 20)),43store.add(new TestView(20, 20, 20, 20))44];4546gridview.addView(views[0], 200, [0]);47gridview.addView(views[1], 200, [1]);48gridview.addView(views[2], 200, [2]);4950assert.deepStrictEqual(nodesToArrays(gridview.getView()), views);51});5253test('gridview addView nested', function () {54const gridview = createGridView();5556const views = [57store.add(new TestView(20, 20, 20, 20)),58[59store.add(new TestView(20, 20, 20, 20)),60store.add(new TestView(20, 20, 20, 20))61]62];6364gridview.addView(views[0] as IView, 200, [0]);65gridview.addView((views[1] as TestView[])[0] as IView, 200, [1]);66gridview.addView((views[1] as TestView[])[1] as IView, 200, [1, 1]);6768assert.deepStrictEqual(nodesToArrays(gridview.getView()), views);69});7071test('gridview addView deep nested', function () {72const gridview = createGridView();7374const view1 = store.add(new TestView(20, 20, 20, 20));75gridview.addView(view1 as IView, 200, [0]);76assert.deepStrictEqual(nodesToArrays(gridview.getView()), [view1]);7778const view2 = store.add(new TestView(20, 20, 20, 20));79gridview.addView(view2 as IView, 200, [1]);80assert.deepStrictEqual(nodesToArrays(gridview.getView()), [view1, view2]);8182const view3 = store.add(new TestView(20, 20, 20, 20));83gridview.addView(view3 as IView, 200, [1, 0]);84assert.deepStrictEqual(nodesToArrays(gridview.getView()), [view1, [view3, view2]]);8586const view4 = store.add(new TestView(20, 20, 20, 20));87gridview.addView(view4 as IView, 200, [1, 0, 0]);88assert.deepStrictEqual(nodesToArrays(gridview.getView()), [view1, [[view4, view3], view2]]);8990const view5 = store.add(new TestView(20, 20, 20, 20));91gridview.addView(view5 as IView, 200, [1, 0]);92assert.deepStrictEqual(nodesToArrays(gridview.getView()), [view1, [view5, [view4, view3], view2]]);9394const view6 = store.add(new TestView(20, 20, 20, 20));95gridview.addView(view6 as IView, 200, [2]);96assert.deepStrictEqual(nodesToArrays(gridview.getView()), [view1, [view5, [view4, view3], view2], view6]);9798const view7 = store.add(new TestView(20, 20, 20, 20));99gridview.addView(view7 as IView, 200, [1, 1]);100assert.deepStrictEqual(nodesToArrays(gridview.getView()), [view1, [view5, view7, [view4, view3], view2], view6]);101102const view8 = store.add(new TestView(20, 20, 20, 20));103gridview.addView(view8 as IView, 200, [1, 1, 0]);104assert.deepStrictEqual(nodesToArrays(gridview.getView()), [view1, [view5, [view8, view7], [view4, view3], view2], view6]);105});106107test('simple layout', function () {108const gridview = createGridView();109gridview.layout(800, 600);110111const view1 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));112gridview.addView(view1, 200, [0]);113assert.deepStrictEqual(view1.size, [800, 600]);114assert.deepStrictEqual(gridview.getViewSize([0]), { width: 800, height: 600 });115116const view2 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));117gridview.addView(view2, 200, [0]);118assert.deepStrictEqual(view1.size, [800, 400]);119assert.deepStrictEqual(gridview.getViewSize([1]), { width: 800, height: 400 });120assert.deepStrictEqual(view2.size, [800, 200]);121assert.deepStrictEqual(gridview.getViewSize([0]), { width: 800, height: 200 });122123const view3 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));124gridview.addView(view3, 200, [1, 1]);125assert.deepStrictEqual(view1.size, [600, 400]);126assert.deepStrictEqual(gridview.getViewSize([1, 0]), { width: 600, height: 400 });127assert.deepStrictEqual(view2.size, [800, 200]);128assert.deepStrictEqual(gridview.getViewSize([0]), { width: 800, height: 200 });129assert.deepStrictEqual(view3.size, [200, 400]);130assert.deepStrictEqual(gridview.getViewSize([1, 1]), { width: 200, height: 400 });131132const view4 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));133gridview.addView(view4, 200, [0, 0]);134assert.deepStrictEqual(view1.size, [600, 400]);135assert.deepStrictEqual(gridview.getViewSize([1, 0]), { width: 600, height: 400 });136assert.deepStrictEqual(view2.size, [600, 200]);137assert.deepStrictEqual(gridview.getViewSize([0, 1]), { width: 600, height: 200 });138assert.deepStrictEqual(view3.size, [200, 400]);139assert.deepStrictEqual(gridview.getViewSize([1, 1]), { width: 200, height: 400 });140assert.deepStrictEqual(view4.size, [200, 200]);141assert.deepStrictEqual(gridview.getViewSize([0, 0]), { width: 200, height: 200 });142143const view5 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));144gridview.addView(view5, 100, [1, 0, 1]);145assert.deepStrictEqual(view1.size, [600, 300]);146assert.deepStrictEqual(gridview.getViewSize([1, 0, 0]), { width: 600, height: 300 });147assert.deepStrictEqual(view2.size, [600, 200]);148assert.deepStrictEqual(gridview.getViewSize([0, 1]), { width: 600, height: 200 });149assert.deepStrictEqual(view3.size, [200, 400]);150assert.deepStrictEqual(gridview.getViewSize([1, 1]), { width: 200, height: 400 });151assert.deepStrictEqual(view4.size, [200, 200]);152assert.deepStrictEqual(gridview.getViewSize([0, 0]), { width: 200, height: 200 });153assert.deepStrictEqual(view5.size, [600, 100]);154assert.deepStrictEqual(gridview.getViewSize([1, 0, 1]), { width: 600, height: 100 });155});156157test('simple layout with automatic size distribution', function () {158const gridview = createGridView();159gridview.layout(800, 600);160161const view1 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));162gridview.addView(view1, Sizing.Distribute, [0]);163assert.deepStrictEqual(view1.size, [800, 600]);164assert.deepStrictEqual(gridview.getViewSize([0]), { width: 800, height: 600 });165166const view2 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));167gridview.addView(view2, Sizing.Distribute, [0]);168assert.deepStrictEqual(view1.size, [800, 300]);169assert.deepStrictEqual(view2.size, [800, 300]);170171const view3 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));172gridview.addView(view3, Sizing.Distribute, [1, 1]);173assert.deepStrictEqual(view1.size, [400, 300]);174assert.deepStrictEqual(view2.size, [800, 300]);175assert.deepStrictEqual(view3.size, [400, 300]);176177const view4 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));178gridview.addView(view4, Sizing.Distribute, [0, 0]);179assert.deepStrictEqual(view1.size, [400, 300]);180assert.deepStrictEqual(view2.size, [400, 300]);181assert.deepStrictEqual(view3.size, [400, 300]);182assert.deepStrictEqual(view4.size, [400, 300]);183184const view5 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));185gridview.addView(view5, Sizing.Distribute, [1, 0, 1]);186assert.deepStrictEqual(view1.size, [400, 150]);187assert.deepStrictEqual(view2.size, [400, 300]);188assert.deepStrictEqual(view3.size, [400, 300]);189assert.deepStrictEqual(view4.size, [400, 300]);190assert.deepStrictEqual(view5.size, [400, 150]);191});192193test('addviews before layout call 1', function () {194const gridview = createGridView();195196const view1 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));197gridview.addView(view1, 200, [0]);198199const view2 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));200gridview.addView(view2, 200, [0]);201202const view3 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));203gridview.addView(view3, 200, [1, 1]);204205gridview.layout(800, 600);206207assert.deepStrictEqual(view1.size, [400, 300]);208assert.deepStrictEqual(view2.size, [800, 300]);209assert.deepStrictEqual(view3.size, [400, 300]);210});211212test('addviews before layout call 2', function () {213const gridview = createGridView();214const view1 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));215gridview.addView(view1, 200, [0]);216217const view2 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));218gridview.addView(view2, 200, [0]);219220const view3 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));221gridview.addView(view3, 200, [0, 0]);222223gridview.layout(800, 600);224225assert.deepStrictEqual(view1.size, [800, 300]);226assert.deepStrictEqual(view2.size, [400, 300]);227assert.deepStrictEqual(view3.size, [400, 300]);228});229230test('flipping orientation should preserve absolute offsets', function () {231const gridview = createGridView();232const view1 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));233gridview.addView(view1, 200, [0]);234235const view2 = store.add(new TestView(50, Number.POSITIVE_INFINITY, 50, Number.POSITIVE_INFINITY));236gridview.addView(view2, 200, [1]);237238gridview.layout(800, 600, 100, 200);239240assert.deepStrictEqual([view1.top, view1.left], [100, 200]);241assert.deepStrictEqual([view2.top, view2.left], [100 + 300, 200]);242243gridview.orientation = Orientation.HORIZONTAL;244245assert.deepStrictEqual([view1.top, view1.left], [100, 200]);246assert.deepStrictEqual([view2.top, view2.left], [100, 200 + 400]);247});248});249250251