Skip to content

Commit 91bbb43

Browse files
committed
Reworked test code to run reliably under async test cases (those which modify CSS and manually trigger a resize event). Also removed unnecessary whitespace change from libglut.js.
Callback sequence for synchronous test cases 1-2: case 1: glutMainLoop -> GLUT.onSize -> Browser.setCanvasSize -> updateResizeListeners -> GLUT.reshapeFunc case 2: glutResizeWindow -> Browser.setCanvasSize -> updateResizeListeners -> GLUT.reshapeFunc Callback sequence for asynchronous test cases 3-5: window resize -> async update -> GLUT.onSize -> Browser.setCanvasSize -> updateResizeListeners -> GLUT.reshapeFunc Because window resize does not immediately call GLUT.onSize, we wait to run verification of a test until we get confirmation in GLUT.reshapeFunc. And after verification is done, we move on to the next test.
1 parent a98aa71 commit 91bbb43

File tree

2 files changed

+104
-43
lines changed

2 files changed

+104
-43
lines changed

src/lib/libglut.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ var LibraryGLUT = {
351351
if (GLUT.reshapeFunc) {
352352
{{{ makeDynCall('vii', 'GLUT.reshapeFunc') }}}(width, height);
353353
}
354-
});
354+
});
355355

356356
addOnExit(() => {
357357
if (isTouchDevice) {

test/browser/test_glut_resize.c

Lines changed: 103 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,26 @@ typedef struct {
1818
static rect_size_t browser_window_size = { 0, 0 };
1919
static rect_size_t glut_init_size = { 0, 0 };
2020
static rect_size_t glut_reshape_size = { 0, 0 };
21+
static rect_size_t target_size = { 0, 0 };
22+
23+
/*
24+
* Set run_async_verification to 0 for sync test cases, and 1 for async tests.
25+
*
26+
* Callback sequence for test case 1 & 2 (synchronous):
27+
* glutMainLoop -> GLUT.onSize -> Browser.setCanvasSize -> updateResizeListeners -> GLUT.reshapeFunc
28+
* glutResizeWindow -> Browser.setCanvasSize -> updateResizeListeners -> GLUT.reshapeFunc
29+
*
30+
* Callback sequence for test cases 3-5 (async):
31+
* window resize -> async update -> GLUT.onSize -> Browser.setCanvasSize -> updateResizeListeners -> GLUT.reshapeFunc
32+
*
33+
* Because window resize does not immediately call GLUT.onSize, we wait to run verification of a test until we get
34+
* confirmation in GLUT.reshapeFunc. And after verification is done, we move on to the next test.
35+
*
36+
*/
37+
static int run_async_verification = 0;
2138

22-
void print_size_test(const char* name, rect_size_t rect_size) {
23-
static int test_count = 0;
24-
printf("Test %d: %s = %d x %d\n", ++test_count, name, rect_size.width, rect_size.height);
39+
void print_size_test(int test_num, const char* name, rect_size_t rect_size) {
40+
printf("Test %d: %s = %d x %d\n", test_num, name, rect_size.width, rect_size.height);
2541
}
2642

2743
int equal_size(rect_size_t rect_1, rect_size_t rect_2) {
@@ -64,7 +80,7 @@ EM_JS(void, test_resize_with_CSS, (const char* position, const char* width, cons
6480
* Verify canvas and reshape callback match target size, and also that
6581
* canvas width, height matches canvas clientWidth, clientHeight
6682
*/
67-
void assert_sizes_equal(rect_size_t target_size) {
83+
void assert_canvas_and_target_sizes_equal() {
6884
/* verify target size match */
6985
rect_size_t canvas_size;
7086
get_canvas_size(&canvas_size.width, &canvas_size.height);
@@ -77,57 +93,102 @@ void assert_sizes_equal(rect_size_t target_size) {
7793
assert(equal_size(canvas_size, canvas_client_size));
7894
}
7995

96+
/**
97+
* Verify the result of the previous test and then run the next one
98+
*/
99+
void verify_test_and_run_next() {
100+
void run_next_test();
101+
102+
assert_canvas_and_target_sizes_equal();
103+
run_next_test();
104+
}
105+
80106
/**
81107
* Resizing tests
82108
*/
83-
void run_tests() {
84-
85-
/* startup */
86-
print_size_test("startup, no CSS: canvas == glutReshapeFunc == glutInitWindow size", glut_init_size);
87-
assert_sizes_equal(glut_init_size);
88-
89-
/* glutReshapeWindow */
90-
rect_size_t new_reshape_size = { glut_init_size.width + 40, glut_init_size.height + 20 };
91-
print_size_test("glut reshape, no CSS: canvas == glutReshapeFunc == glutReshapeWindow size", new_reshape_size);
92-
glutReshapeWindow(new_reshape_size.width, new_reshape_size.height);
93-
assert_sizes_equal(new_reshape_size);
94-
95-
/* 100% scale CSS */
96-
print_size_test("100% window scale CSS: canvas == glutReshapeFunc == browser window size", browser_window_size);
97-
test_resize_with_CSS("fixed", "100%", "100%"); /* fixed, so canvas is driven by window size */
98-
assert_sizes_equal(browser_window_size);
99-
100-
/* specific pixel size CSS */
101-
rect_size_t css_pixels_size = { glut_init_size.width - 20, glut_init_size.height + 40 };
102-
print_size_test("specific pixel size CSS: canvas == glutReshapeFunc == CSS specific size", css_pixels_size);
103-
char css_width[16], css_height[16];
104-
snprintf (css_width, 16, "%dpx", css_pixels_size.width);
105-
snprintf (css_height, 16, "%dpx", css_pixels_size.height);
106-
test_resize_with_CSS("static", css_width, css_height); /* static, canvas is driven by CSS size */
107-
assert_sizes_equal(css_pixels_size);
108-
109-
/* mix of CSS scale and pixel size */
110-
rect_size_t css_mixed_size = { browser_window_size.width * 0.6, 100 };
111-
print_size_test("60% width, 100px height CSS: canvas == glutReshapeFunc == CSS mixed size", css_mixed_size);
112-
test_resize_with_CSS("fixed", "60%", "100px"); /* fixed, canvas width is driven by window size */
113-
assert_sizes_equal(css_mixed_size);
114-
115-
/* run tests once */
116-
glutIdleFunc(NULL);
117-
emscripten_force_exit(0);
109+
void run_next_test() {
110+
static int test_num = 0;
111+
++test_num;
112+
113+
switch(test_num) {
114+
case 1: {
115+
/* startup */
116+
target_size = glut_init_size;
117+
print_size_test(test_num, "startup, no CSS: canvas == glutReshapeFunc == glutInitWindow size", target_size);
118+
verify_test_and_run_next();
119+
break;
120+
}
121+
case 2: {
122+
/* glutReshapeWindow */
123+
target_size.width = glut_init_size.width + 40;
124+
target_size.height = glut_init_size.height + 20;
125+
print_size_test(test_num, "glut reshape, no CSS: canvas == glutReshapeFunc == glutReshapeWindow size", target_size);
126+
glutReshapeWindow(target_size.width, target_size.height);
127+
verify_test_and_run_next();
128+
break;
129+
}
130+
case 3: {
131+
/* 100% scale CSS */
132+
target_size = browser_window_size;
133+
print_size_test(test_num, "100% window scale CSS: canvas == glutReshapeFunc == browser window size", target_size);
134+
run_async_verification = 1;
135+
test_resize_with_CSS("fixed", "100%", "100%"); /* fixed, so canvas is driven by window size */
136+
break;
137+
}
138+
case 4: {
139+
/* specific pixel size CSS */
140+
target_size.width = glut_init_size.width - 20;
141+
target_size.height = glut_init_size.height + 40;
142+
print_size_test(test_num, "specific pixel size CSS: canvas == glutReshapeFunc == CSS specific size", target_size);
143+
char css_width[16], css_height[16];
144+
snprintf (css_width, 16, "%dpx", target_size.width);
145+
snprintf (css_height, 16, "%dpx", target_size.height);
146+
run_async_verification = 1;
147+
test_resize_with_CSS("static", css_width, css_height); /* static, canvas is driven by CSS size */
148+
break;
149+
}
150+
case 5: {
151+
/* mix of CSS scale and pixel size */
152+
target_size.width = browser_window_size.width;
153+
target_size.height = 100;
154+
print_size_test(test_num, "100% width, 100px height CSS: canvas == glutReshapeFunc == CSS mixed size", target_size);
155+
run_async_verification = 1;
156+
test_resize_with_CSS("fixed", "100%", "100px"); /* fixed, canvas width is driven by window size */
157+
break;
158+
}
159+
default: {
160+
/* all tests complete */
161+
emscripten_force_exit(0);
162+
break;
163+
}
164+
}
118165
}
119166

120167
/**
121-
* Reshape callback
168+
* Idle callback - start tests
169+
*/
170+
void start_tests() {
171+
glutIdleFunc(NULL);
172+
run_next_test();
173+
}
174+
175+
/**
176+
* Reshape callback - record latest size, verify and run next test if async
122177
*/
123178
void reshape(int w, int h) {
124179
glut_reshape_size.width = w;
125180
glut_reshape_size.height = h;
181+
182+
if (run_async_verification) {
183+
run_async_verification = 0; /* Only one verification per test */
184+
verify_test_and_run_next();
185+
}
126186
}
127187

128188
int main(int argc, char *argv[]) {
129-
/* Make glut initial canvas size be 1/2 of browser window */
130189
get_browser_window_size(&browser_window_size.width, &browser_window_size.height);
190+
191+
/* Make glut initial canvas size be 1/2 of browser window */
131192
glut_init_size.width = browser_window_size.width / 2;
132193
glut_init_size.height = browser_window_size.height / 2;
133194

@@ -137,7 +198,7 @@ int main(int argc, char *argv[]) {
137198
glutCreateWindow("test_glut_resize.c");
138199

139200
/* Set up glut callback functions */
140-
glutIdleFunc(run_tests);
201+
glutIdleFunc(start_tests);
141202
glutReshapeFunc(reshape);
142203
glutDisplayFunc(NULL);
143204

0 commit comments

Comments
 (0)