/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "Test.h"
#include "SkChunkAlloc.h"
#include "SkUtils.h"

static void test_chunkalloc(skiatest::Reporter* reporter) {
    size_t min = 256;
    SkChunkAlloc alloc(min);
    
    REPORTER_ASSERT(reporter, 0 == alloc.totalCapacity());
    REPORTER_ASSERT(reporter, 0 == alloc.blockCount());
    REPORTER_ASSERT(reporter, !alloc.contains(NULL));
    REPORTER_ASSERT(reporter, !alloc.contains(reporter));

    alloc.reset();
    REPORTER_ASSERT(reporter, 0 == alloc.totalCapacity());
    REPORTER_ASSERT(reporter, 0 == alloc.blockCount());

    size_t size = min >> 1;
    void* ptr = alloc.allocThrow(size);
    REPORTER_ASSERT(reporter, alloc.totalCapacity() >= size);
    REPORTER_ASSERT(reporter, alloc.blockCount() > 0);
    REPORTER_ASSERT(reporter, alloc.contains(ptr));
    
    alloc.reset();
    REPORTER_ASSERT(reporter, !alloc.contains(ptr));
}

///////////////////////////////////////////////////////////////////////////////

static void set_zero(void* dst, size_t bytes) {
    char* ptr = (char*)dst;
    for (size_t i = 0; i < bytes; ++i) {
        ptr[i] = 0;
    }
}

#define MAX_ALIGNMENT   64
#define MAX_COUNT       ((MAX_ALIGNMENT) * 32)
#define PAD             32
#define TOTAL           (PAD + MAX_ALIGNMENT + MAX_COUNT + PAD)

#define VALUE16         0x1234
#define VALUE32         0x12345678

static bool compare16(const uint16_t base[], uint16_t value, int count) {
    for (int i = 0; i < count; ++i) {
        if (base[i] != value) {
            SkDebugf("[%d] expected %x found %x\n", i, value, base[i]);
            return false;
        }
    }
    return true;
}

static bool compare32(const uint32_t base[], uint32_t value, int count) {
    for (int i = 0; i < count; ++i) {
        if (base[i] != value) {
            SkDebugf("[%d] expected %x found %x\n", i, value, base[i]);
            return false;
        }
    }
    return true;
}

static void test_16(skiatest::Reporter* reporter) {
    uint16_t buffer[TOTAL];
    
    for (int count = 0; count < MAX_COUNT; ++count) {
        for (int alignment = 0; alignment < MAX_ALIGNMENT; ++alignment) {
            set_zero(buffer, sizeof(buffer));
            
            uint16_t* base = &buffer[PAD + alignment];
            sk_memset16(base, VALUE16, count);
            
            compare16(buffer,       0,       PAD + alignment);
            compare16(base,         VALUE16, count);
            compare16(base + count, 0,       TOTAL - count - PAD - alignment);
        }
    }
}

static void test_32(skiatest::Reporter* reporter) {
    uint32_t buffer[TOTAL];
    
    for (int count = 0; count < MAX_COUNT; ++count) {
        for (int alignment = 0; alignment < MAX_ALIGNMENT; ++alignment) {
            set_zero(buffer, sizeof(buffer));
            
            uint32_t* base = &buffer[PAD + alignment];
            sk_memset32(base, VALUE32, count);
            
            compare32(buffer,       0,       PAD + alignment);
            compare32(base,         VALUE32, count);
            compare32(base + count, 0,       TOTAL - count - PAD - alignment);
        }
    }
}

/**
 *  Test sk_memset16 and sk_memset32.
 *  For performance considerations, implementations may take different paths
 *  depending on the alignment of the dst, and/or the size of the count.
 */
static void TestMemset(skiatest::Reporter* reporter) {
    test_16(reporter);
    test_32(reporter);
    
    test_chunkalloc(reporter);
};

#include "TestClassDef.h"
DEFINE_TESTCLASS("Memset", TestMemsetClass, TestMemset)
