/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2017 - ROLI Ltd. JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 5 End-User License Agreement and JUCE 5 Privacy Policy (both updated and effective as of the 27th April 2017). End User License Agreement: www.juce.com/juce-5-licence Privacy Policy: www.juce.com/juce-5-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ struct GridTests : public juce::UnitTest { GridTests() : juce::UnitTest ("Grid class") {} void runTest() override { using Fr = juce::Grid::Fr; using Tr = juce::Grid::TrackInfo; using Rect = juce::Rectangle; using Grid = juce::Grid; { Grid grid; grid.templateColumns.add (Tr (1_fr)); grid.templateRows.addArray ({ Tr (20_px), Tr (1_fr) }); grid.items.addArray ({ GridItem().withArea (1, 1), GridItem().withArea (2, 1) }); grid.performLayout (juce::Rectangle (200, 400)); beginTest ("Layout calculation test: 1 column x 2 rows: no gap"); expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 200.f, 20.0f)); expect (grid.items[1].currentBounds == Rect (0.0f, 20.0f, 200.f, 380.0f)); grid.templateColumns.add (Tr (50_px)); grid.templateRows.add (Tr (2_fr)); grid.items.addArray ( { GridItem().withArea (1, 2), GridItem().withArea (2, 2), GridItem().withArea (3, 1), GridItem().withArea (3, 2) }); grid.performLayout (juce::Rectangle (150, 170)); beginTest ("Layout calculation test: 2 columns x 3 rows: no gap"); expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 100.0f, 20.0f)); expect (grid.items[1].currentBounds == Rect (0.0f, 20.0f, 100.0f, 50.0f)); expect (grid.items[2].currentBounds == Rect (100.0f, 0.0f, 50.0f, 20.0f)); expect (grid.items[3].currentBounds == Rect (100.0f, 20.0f, 50.0f, 50.0f)); expect (grid.items[4].currentBounds == Rect (0.0f, 70.0f, 100.0f, 100.0f)); expect (grid.items[5].currentBounds == Rect (100.0f, 70.0f, 50.0f, 100.0f)); grid.columnGap = 20_px; grid.rowGap = 10_px; grid.performLayout (juce::Rectangle (200, 310)); beginTest ("Layout calculation test: 2 columns x 3 rows: rowGap of 10 and columnGap of 20"); expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 130.0f, 20.0f)); expect (grid.items[1].currentBounds == Rect (0.0f, 30.0f, 130.0f, 90.0f)); expect (grid.items[2].currentBounds == Rect (150.0f, 0.0f, 50.0f, 20.0f)); expect (grid.items[3].currentBounds == Rect (150.0f, 30.0f, 50.0f, 90.0f)); expect (grid.items[4].currentBounds == Rect (0.0f, 130.0f, 130.0f, 180.0f)); expect (grid.items[5].currentBounds == Rect (150.0f, 130.0f, 50.0f, 180.0f)); } { Grid grid; grid.templateColumns.addArray ({ Tr ("first", 20_px, "in"), Tr ("in", 1_fr, "in"), Tr (20_px, "last") }); grid.templateRows.addArray ({ Tr (1_fr), Tr (20_px)}); { beginTest ("Grid items placement tests: integer and custom ident, counting forward"); GridItem i1, i2, i3, i4, i5; i1.column = { 1, 4 }; i1.row = { 1, 2 }; i2.column = { 1, 3 }; i2.row = { 1, 3 }; i3.column = { "first", "in" }; i3.row = { 2, 3 }; i4.column = { "first", { 2, "in" } }; i4.row = { 1, 2 }; i5.column = { "first", "last" }; i5.row = { 1, 2 }; grid.items.addArray ({ i1, i2, i3, i4, i5 }); grid.performLayout ({ 140, 100 }); expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 140.0f, 80.0f)); expect (grid.items[1].currentBounds == Rect (0.0f, 0.0f, 120.0f, 100.0f)); expect (grid.items[2].currentBounds == Rect (0.0f, 80.0f, 20.0f, 20.0f)); expect (grid.items[3].currentBounds == Rect (0.0f, 0.0f, 120.0f, 80.0f)); expect (grid.items[4].currentBounds == Rect (0.0f, 0.0f, 140.0f, 80.0f)); } } { Grid grid; grid.templateColumns.addArray ({ Tr ("first", 20_px, "in"), Tr ("in", 1_fr, "in"), Tr (20_px, "last") }); grid.templateRows.addArray ({ Tr (1_fr), Tr (20_px)}); beginTest ("Grid items placement tests: integer and custom ident, counting forward, reversed end and start"); GridItem i1, i2, i3, i4, i5; i1.column = { 4, 1 }; i1.row = { 2, 1 }; i2.column = { 3, 1 }; i2.row = { 3, 1 }; i3.column = { "in", "first" }; i3.row = { 3, 2 }; i4.column = { "first", { 2, "in" } }; i4.row = { 1, 2 }; i5.column = { "last", "first" }; i5.row = { 1, 2 }; grid.items.addArray ({ i1, i2, i3, i4, i5 }); grid.performLayout ({ 140, 100 }); expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 140.0f, 80.0f)); expect (grid.items[1].currentBounds == Rect (0.0f, 0.0f, 120.0f, 100.0f)); expect (grid.items[2].currentBounds == Rect (0.0f, 80.0f, 20.0f, 20.0f)); expect (grid.items[3].currentBounds == Rect (0.0f, 0.0f, 120.0f, 80.0f)); expect (grid.items[4].currentBounds == Rect (0.0f, 0.0f, 140.0f, 80.0f)); } { beginTest ("Grid items placement tests: areas"); Grid grid; grid.templateColumns = { Tr (50_px), Tr (100_px), Tr (Fr (1_fr)), Tr (50_px) }; grid.templateRows = { Tr (50_px), Tr (1_fr), Tr (50_px) }; grid.templateAreas = { "header header header header", "main main . sidebar", "footer footer footer footer" }; grid.items.addArray ({ GridItem().withArea ("header"), GridItem().withArea ("main"), GridItem().withArea ("sidebar"), GridItem().withArea ("footer"), }); grid.performLayout ({ 300, 150 }); expect (grid.items[0].currentBounds == Rect (0.f, 0.f, 300.f, 50.f)); expect (grid.items[1].currentBounds == Rect (0.f, 50.f, 150.f, 50.f)); expect (grid.items[2].currentBounds == Rect (250.f, 50.f, 50.f, 50.f)); expect (grid.items[3].currentBounds == Rect (0.f, 100.f, 300.f, 50.f)); } { beginTest ("Grid implicit rows and columns: triggered by areas"); Grid grid; grid.templateColumns = { Tr (50_px), Tr (100_px), Tr (1_fr), Tr (50_px) }; grid.templateRows = { Tr (50_px), Tr (1_fr), Tr (50_px) }; grid.autoRows = Tr (30_px); grid.autoColumns = Tr (30_px); grid.templateAreas = { "header header header header header", "main main . sidebar sidebar", "footer footer footer footer footer", "sub sub sub sub sub"}; grid.items.addArray ({ GridItem().withArea ("header"), GridItem().withArea ("main"), GridItem().withArea ("sidebar"), GridItem().withArea ("footer"), GridItem().withArea ("sub"), }); grid.performLayout ({ 330, 180 }); expect (grid.items[0].currentBounds == Rect (0.f, 0.f, 330.f, 50.f)); expect (grid.items[1].currentBounds == Rect (0.f, 50.f, 150.f, 50.f)); expect (grid.items[2].currentBounds == Rect (250.f, 50.f, 80.f, 50.f)); expect (grid.items[3].currentBounds == Rect (0.f, 100.f, 330.f, 50.f)); expect (grid.items[4].currentBounds == Rect (0.f, 150.f, 330.f, 30.f)); } { beginTest ("Grid implicit rows and columns: triggered by areas"); Grid grid; grid.templateColumns = { Tr (50_px), Tr (100_px), Tr (1_fr), Tr (50_px) }; grid.templateRows = { Tr (50_px), Tr (1_fr), Tr (50_px) }; grid.autoRows = Tr (1_fr); grid.autoColumns = Tr (1_fr); grid.templateAreas = { "header header header header", "main main . sidebar", "footer footer footer footer" }; grid.items.addArray ({ GridItem().withArea ("header"), GridItem().withArea ("main"), GridItem().withArea ("sidebar"), GridItem().withArea ("footer"), GridItem().withArea (4, 5, 6, 7) }); grid.performLayout ({ 350, 250 }); expect (grid.items[0].currentBounds == Rect (0.f, 0.f, 250.f, 50.f)); expect (grid.items[1].currentBounds == Rect (0.f, 50.f, 150.f, 50.f)); expect (grid.items[2].currentBounds == Rect (200.f, 50.f, 50.f, 50.f)); expect (grid.items[3].currentBounds == Rect (0.f, 100.f, 250.f, 50.f)); expect (grid.items[4].currentBounds == Rect (250.f, 150.f, 100.f, 100.f)); } } }; static GridTests gridUnitTests;