// Copyright 2015 The Emscripten Authors.  All rights reserved.
// Emscripten is available under two separate licenses, the MIT license and the
// University of Illinois/NCSA Open Source License.  Both these licenses can be
// found in the LICENSE file.

#include <SDL.h>
#include <emscripten.h>

#define TOTAL_RUNS 20

static SDL_Window *window;
static SDL_Surface *surface;

static void sdlError(const char *str) 
{
    fprintf(stderr, "Error at %s: %s\n", str, SDL_GetError());
    emscripten_force_exit(1);
}

static void main_loop(void)
{
    static unsigned int runs = 0;

    // verify that the ctx and image do not change from frame to frame
    if (runs == 1) {
        EM_ASM({
            Module.the_ctx = Module.SDL2.ctx;
            Module.the_image = Module.SDL2.image;
            out('start with ' + [Module.the_ctx, Module.the_image]);
            assert(!!Module.the_ctx && (typeof Module.the_ctx === 'object'), 'typeof ctx');
            assert(!!Module.the_image && (typeof Module.the_image === 'object'), 'typeof image');
            out('set values');
        });
    } else if (runs > 1) {
        EM_ASM({
            assert(Module.the_ctx === Module.SDL2.ctx, 'ctx');
            assert(Module.the_image === Module.SDL2.image, 'image');
            out('check ok ' + $0);
        }, runs);
    }

    int i;
    if (SDL_LockSurface(surface) != 0) sdlError("SDL_LockSurface");
    SDL_UnlockSurface(surface); // does not return a value
    if (SDL_UpdateWindowSurface(window) != 0)
        sdlError("SDL_UpdateWindowSurface");

    runs++;
    if (runs >= TOTAL_RUNS) {
        emscripten_cancel_main_loop();
        REPORT_RESULT(1);
    }
}

int main(void)
{
    if (SDL_Init(SDL_INIT_VIDEO) != 0) sdlError("SDL_Init");

    window = SDL_CreateWindow("SDL 2 test",
                              0, 0,
                              640, 480,
                              SDL_WINDOW_SHOWN);
    if (window == NULL) sdlError("SDL_CreateWindow");
    surface = SDL_GetWindowSurface(window);
    if (surface == NULL) sdlError("SDL_GetWindowSurface");

    emscripten_set_main_loop(main_loop, 0, 1);
}

