Skip to content

Commit 33030ec

Browse files
Grid WIP
1 parent 8ba025e commit 33030ec

25 files changed

+9040
-11
lines changed

tests/generated/YGGridTest.cpp

Lines changed: 4871 additions & 0 deletions
Large diffs are not rendered by default.

tests/grid/AutoPlacementTest.cpp

Lines changed: 403 additions & 0 deletions
Large diffs are not rendered by default.

tests/grid/CreateGridTrackTest.cpp

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#include <gtest/gtest.h>
9+
#include <yoga/Yoga.h>
10+
#include <yoga/node/Node.h>
11+
#include <yoga/algorithm/grid/GridLayout.h>
12+
#include <yoga/algorithm/grid/AutoPlacement.h>
13+
#include <yoga/style/GridTrack.h>
14+
#include <yoga/style/StyleLength.h>
15+
16+
using namespace facebook::yoga;
17+
18+
class GridCreateTracksTest : public ::testing::Test {
19+
protected:
20+
void SetUp() override {
21+
gridContainer = new Node();
22+
gridContainer->style().setDisplay(Display::Grid);
23+
}
24+
25+
void TearDown() override {
26+
delete gridContainer;
27+
}
28+
29+
Node* gridContainer;
30+
31+
Node* createGridItem(GridLine columnStart = GridLine::auto_(),
32+
GridLine columnEnd = GridLine::auto_(),
33+
GridLine rowStart = GridLine::auto_(),
34+
GridLine rowEnd = GridLine::auto_()) {
35+
auto item = new Node();
36+
item->style().setGridColumnStart(columnStart);
37+
item->style().setGridColumnEnd(columnEnd);
38+
item->style().setGridRowStart(rowStart);
39+
item->style().setGridRowEnd(rowEnd);
40+
gridContainer->insertChild(item, gridContainer->getChildren().size());
41+
return item;
42+
}
43+
};
44+
45+
TEST_F(GridCreateTracksTest, only_explicit_tracks) {
46+
std::vector<GridTrackSize> columns = {
47+
GridTrackSize::length(100.0f),
48+
GridTrackSize::length(150.0f)
49+
};
50+
std::vector<GridTrackSize> rows = {
51+
GridTrackSize::length(80.0f),
52+
GridTrackSize::fr(1.0f)
53+
};
54+
55+
gridContainer->style().setGridTemplateColumns(std::move(columns));
56+
gridContainer->style().setGridTemplateRows(std::move(rows));
57+
58+
createGridItem(GridLine::fromInteger(1), GridLine::fromInteger(2),
59+
GridLine::fromInteger(1), GridLine::fromInteger(2));
60+
createGridItem(GridLine::fromInteger(2), GridLine::fromInteger(3),
61+
GridLine::fromInteger(2), GridLine::fromInteger(3));
62+
63+
auto autoPlacementResult = resolveGridItemPlacements(gridContainer);
64+
GridTracks tracks = createGridTracks(gridContainer, autoPlacementResult);
65+
66+
EXPECT_EQ(tracks.columnTracks.size(), 2);
67+
EXPECT_TRUE(tracks.columnTracks[0].minSizingFunction.isPoints());
68+
EXPECT_TRUE(tracks.columnTracks[1].minSizingFunction.isPoints());
69+
70+
EXPECT_EQ(tracks.rowTracks.size(), 2);
71+
EXPECT_TRUE(tracks.rowTracks[0].minSizingFunction.isPoints());
72+
EXPECT_TRUE(tracks.rowTracks[1].maxSizingFunction.isStretch());
73+
}
74+
75+
TEST_F(GridCreateTracksTest, implicit_tracks_after_explicit_grid) {
76+
std::vector<GridTrackSize> columns = {
77+
GridTrackSize::length(100.0f),
78+
GridTrackSize::length(150.0f)
79+
};
80+
81+
gridContainer->style().setGridTemplateColumns(std::move(columns));
82+
83+
createGridItem(GridLine::fromInteger(1), GridLine::fromInteger(5),
84+
GridLine::fromInteger(1), GridLine::fromInteger(2));
85+
86+
auto autoPlacementResult = resolveGridItemPlacements(gridContainer);
87+
GridTracks tracks = createGridTracks(gridContainer, autoPlacementResult);
88+
89+
EXPECT_EQ(tracks.columnTracks.size(), 4);
90+
91+
EXPECT_TRUE(tracks.columnTracks[0].minSizingFunction.isPoints());
92+
EXPECT_TRUE(tracks.columnTracks[1].minSizingFunction.isPoints());
93+
94+
EXPECT_TRUE(tracks.columnTracks[2].minSizingFunction.isAuto());
95+
EXPECT_TRUE(tracks.columnTracks[3].minSizingFunction.isAuto());
96+
}
97+
98+
TEST_F(GridCreateTracksTest, implicit_tracks_before_explicit_grid_negative_indices) {
99+
std::vector<GridTrackSize> columns = {
100+
GridTrackSize::length(20.0f),
101+
GridTrackSize::length(20.0f),
102+
GridTrackSize::length(20.0f)
103+
};
104+
105+
gridContainer->style().setGridTemplateColumns(std::move(columns));
106+
107+
createGridItem(GridLine::fromInteger(-5), GridLine::fromInteger(-4));
108+
109+
auto autoPlacementResult = resolveGridItemPlacements(gridContainer);
110+
GridTracks tracks = createGridTracks(gridContainer, autoPlacementResult);
111+
112+
EXPECT_EQ(tracks.columnTracks.size(), 4);
113+
114+
EXPECT_TRUE(tracks.columnTracks[0].minSizingFunction.isAuto());
115+
}
116+
117+
TEST_F(GridCreateTracksTest, implicit_tracks_before_and_after) {
118+
std::vector<GridTrackSize> columns = {
119+
GridTrackSize::length(100.0f),
120+
GridTrackSize::fr(1.0f)
121+
};
122+
123+
// creates 3 grid lines 1, 2, 3
124+
gridContainer->style().setGridTemplateColumns(std::move(columns));
125+
// -4 index = 0 index. 1 new track before. and 5 index = 1 new track after. total 5 tracks
126+
createGridItem(GridLine::fromInteger(-4), GridLine::fromInteger(5));
127+
128+
auto autoPlacementResult = resolveGridItemPlacements(gridContainer);
129+
GridTracks tracks = createGridTracks(gridContainer, autoPlacementResult);
130+
131+
EXPECT_EQ(tracks.columnTracks.size(), 5);
132+
EXPECT_TRUE(tracks.columnTracks[0].minSizingFunction.isAuto());
133+
EXPECT_TRUE(tracks.columnTracks[1].minSizingFunction.isPoints());
134+
EXPECT_TRUE(tracks.columnTracks[2].maxSizingFunction.isStretch());
135+
EXPECT_TRUE(tracks.columnTracks[4].minSizingFunction.isAuto());
136+
EXPECT_TRUE(tracks.columnTracks[4].minSizingFunction.isAuto());
137+
}
138+
139+
TEST_F(GridCreateTracksTest, no_explicit_tracks_only_implicit) {
140+
createGridItem();
141+
createGridItem();
142+
createGridItem();
143+
144+
auto autoPlacementResult = resolveGridItemPlacements(gridContainer);
145+
GridTracks tracks = createGridTracks(gridContainer, autoPlacementResult);
146+
147+
for (const auto& track : tracks.columnTracks) {
148+
EXPECT_TRUE(track.minSizingFunction.isAuto());
149+
}
150+
151+
for (const auto& track : tracks.rowTracks) {
152+
EXPECT_TRUE(track.minSizingFunction.isAuto());
153+
}
154+
}
155+
156+
TEST_F(GridCreateTracksTest, empty_grid_no_items) {
157+
std::vector<GridTrackSize> columns = {
158+
GridTrackSize::length(100.0f),
159+
GridTrackSize::length(150.0f)
160+
};
161+
162+
gridContainer->style().setGridTemplateColumns(std::move(columns));
163+
164+
auto autoPlacementResult = resolveGridItemPlacements(gridContainer);
165+
GridTracks tracks = createGridTracks(gridContainer, autoPlacementResult);
166+
EXPECT_EQ(tracks.columnTracks.size(), 2);
167+
}
168+
169+
TEST_F(GridCreateTracksTest, large_span_creating_many_implicit_tracks) {
170+
createGridItem(GridLine::auto_(), GridLine::span(10));
171+
172+
auto autoPlacementResult = resolveGridItemPlacements(gridContainer);
173+
GridTracks tracks = createGridTracks(gridContainer, autoPlacementResult);
174+
175+
EXPECT_EQ(tracks.columnTracks.size(), 10);
176+
177+
for (const auto& track : tracks.columnTracks) {
178+
EXPECT_TRUE(track.minSizingFunction.isAuto());
179+
}
180+
}

0 commit comments

Comments
 (0)