| Index: forth/ForthTests.cpp
|
| diff --git a/forth/ForthTests.cpp b/forth/ForthTests.cpp
|
| deleted file mode 100644
|
| index 8dc06c05be27f1696a502f493d17bf07c9b6cb15..0000000000000000000000000000000000000000
|
| --- a/forth/ForthTests.cpp
|
| +++ /dev/null
|
| @@ -1,407 +0,0 @@
|
| -
|
| -/*
|
| - * 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 "Forth.h"
|
| -#include "SkString.h"
|
| -
|
| -class Reporter {
|
| -public:
|
| - int fFailureCount;
|
| -
|
| - Reporter() : fFailureCount(0) {}
|
| - void reportFailure(const char expression[], const char file[], int line);
|
| - void reportFailure(const char msg[]);
|
| -};
|
| -
|
| -typedef void (*ForthWordTestProc)(ForthWord*, ForthEngine*, Reporter*);
|
| -
|
| -#define FORTH_ASSERT(reporter, expression) \
|
| - do { \
|
| - if (!(expression)) { \
|
| - reporter->reportFailure(#expression, __FILE__, __LINE__); \
|
| - } \
|
| - } while (0)
|
| -
|
| -static void drop_test0(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(-17);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 0 == fe->depth());
|
| -}
|
| -
|
| -static void drop_test1(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(-17);
|
| - fe->push(93);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, -17 == fe->peek(0));
|
| -}
|
| -
|
| -static void dup_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(-17);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 2 == fe->depth());
|
| - FORTH_ASSERT(reporter, -17 == fe->peek(0));
|
| - FORTH_ASSERT(reporter, -17 == fe->peek(1));
|
| -}
|
| -
|
| -static void swap_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(-17);
|
| - fe->push(42);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 2 == fe->depth());
|
| - FORTH_ASSERT(reporter, -17 == fe->peek(0));
|
| - FORTH_ASSERT(reporter, 42 == fe->peek(1));
|
| -}
|
| -
|
| -static void over_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(1);
|
| - fe->push(2);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 3 == fe->depth());
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(0));
|
| - FORTH_ASSERT(reporter, 2 == fe->peek(1));
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(2));
|
| -}
|
| -
|
| -static void rot_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(1);
|
| - fe->push(2);
|
| - fe->push(3);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 3 == fe->depth());
|
| - FORTH_ASSERT(reporter, 2 == fe->peek(2));
|
| - FORTH_ASSERT(reporter, 3 == fe->peek(1));
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(0));
|
| -}
|
| -
|
| -static void rrot_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(1);
|
| - fe->push(2);
|
| - fe->push(3);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 3 == fe->depth());
|
| - FORTH_ASSERT(reporter, 2 == fe->peek(0));
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(1));
|
| - FORTH_ASSERT(reporter, 3 == fe->peek(2));
|
| -}
|
| -
|
| -static void swap2_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(1);
|
| - fe->push(2);
|
| - fe->push(3);
|
| - fe->push(4);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 4 == fe->depth());
|
| - FORTH_ASSERT(reporter, 2 == fe->peek(0));
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(1));
|
| - FORTH_ASSERT(reporter, 4 == fe->peek(2));
|
| - FORTH_ASSERT(reporter, 3 == fe->peek(3));
|
| -}
|
| -
|
| -static void dup2_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(1);
|
| - fe->push(2);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 4 == fe->depth());
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(3));
|
| - FORTH_ASSERT(reporter, 2 == fe->peek(2));
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(1));
|
| - FORTH_ASSERT(reporter, 2 == fe->peek(0));
|
| -}
|
| -
|
| -static void over2_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(1);
|
| - fe->push(2);
|
| - fe->push(3);
|
| - fe->push(4);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 6 == fe->depth());
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(5));
|
| - FORTH_ASSERT(reporter, 2 == fe->peek(4));
|
| - FORTH_ASSERT(reporter, 3 == fe->peek(3));
|
| - FORTH_ASSERT(reporter, 4 == fe->peek(2));
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(1));
|
| - FORTH_ASSERT(reporter, 2 == fe->peek(0));
|
| -}
|
| -
|
| -static void drop2_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(1);
|
| - fe->push(2);
|
| - fe->push(3);
|
| - fe->push(4);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 2 == fe->depth());
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(1));
|
| - FORTH_ASSERT(reporter, 2 == fe->peek(0));
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -static void iadd_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(35);
|
| - fe->push(99);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 134 == fe->top());
|
| - fe->push(-135);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, -1 == fe->top());
|
| -}
|
| -
|
| -static void isub_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(35);
|
| - fe->push(99);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 35-99 == fe->top());
|
| -}
|
| -
|
| -static void imul_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(15);
|
| - fe->push(-20);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, -300 == fe->top());
|
| - fe->push(0);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 0 == fe->top());
|
| -}
|
| -
|
| -static void idiv_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(100);
|
| - fe->push(25);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 4 == fe->top());
|
| - fe->setTop(10);
|
| - fe->push(-3);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, -3 == fe->top());
|
| - fe->setTop(-1);
|
| - fe->push(-1);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 1 == fe->top());
|
| -}
|
| -
|
| -static void imod_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(10);
|
| - fe->push(3);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 1 == fe->top());
|
| - fe->push(5);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 1 == fe->top());
|
| -}
|
| -
|
| -static void idivmod_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(10);
|
| - fe->push(3);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 2 == fe->depth());
|
| - FORTH_ASSERT(reporter, 1 == fe->peek(1));
|
| - FORTH_ASSERT(reporter, 3 == fe->peek(0));
|
| -}
|
| -
|
| -static void idot_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(1);
|
| - fe->push(2);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 1 == fe->top());
|
| -}
|
| -
|
| -static void iabs_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(10);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 10 == fe->top());
|
| - fe->setTop(-10);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 10 == fe->top());
|
| -}
|
| -
|
| -static void inegate_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(10);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, -10 == fe->top());
|
| - fe->setTop(-10);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 10 == fe->top());
|
| -}
|
| -
|
| -static void imin_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(10);
|
| - fe->push(3);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 3 == fe->top());
|
| - fe->push(-10);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, -10 == fe->top());
|
| -}
|
| -
|
| -static void imax_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(10);
|
| - fe->push(3);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 10 == fe->top());
|
| - fe->push(-10);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 10 == fe->top());
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -static void logical_and_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - const static int data[] = {
|
| - 0, 0, 0,
|
| - 2, 0, 0,
|
| - 0, -1, 0,
|
| - 1, 5, -1
|
| - };
|
| - for (size_t i = 0; i < SK_ARRAY_COUNT(data)/3; i++) {
|
| - fe->push(data[i*3 + 0]);
|
| - fe->push(data[i*3 + 1]);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, data[i*3 + 2] == fe->top());
|
| - fe->pop();
|
| - }
|
| -}
|
| -
|
| -static void logical_or_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - const static int data[] = {
|
| - 0, 0, 0,
|
| - 2, 0, -1,
|
| - 0, -1, -1,
|
| - 1, 5, -1
|
| - };
|
| - for (size_t i = 0; i < SK_ARRAY_COUNT(data)/3; i++) {
|
| - fe->push(data[i*3 + 0]);
|
| - fe->push(data[i*3 + 1]);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, data[i*3 + 2] == fe->top());
|
| - fe->pop();
|
| - }
|
| -}
|
| -
|
| -static void logical_not_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - const static int data[] = {
|
| - 0, -1,
|
| - 5, 0,
|
| - -1, 0
|
| - };
|
| - for (size_t i = 0; i < SK_ARRAY_COUNT(data)/2; i++) {
|
| - fe->push(data[i*2 + 0]);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, data[i*2 + 1] == fe->top());
|
| - fe->pop();
|
| - }
|
| -}
|
| -
|
| -static void if_dup_test(ForthWord* word, ForthEngine* fe, Reporter* reporter) {
|
| - fe->push(10);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 2 == fe->depth());
|
| - FORTH_ASSERT(reporter, 10 == fe->peek(1));
|
| - FORTH_ASSERT(reporter, 10 == fe->peek(0));
|
| - fe->pop();
|
| - fe->pop();
|
| - fe->push(0);
|
| - word->exec(fe);
|
| - FORTH_ASSERT(reporter, 1 == fe->depth());
|
| - FORTH_ASSERT(reporter, 0 == fe->top());
|
| -}
|
| -
|
| -static const struct {
|
| - const char* fName;
|
| - ForthWordTestProc fProc;
|
| -} gRecs[] = {
|
| - { "DROP", drop_test0 }, { "DROP", drop_test1 },
|
| - { "DUP", dup_test },
|
| - { "SWAP", swap_test },
|
| - { "OVER", over_test },
|
| - { "ROT", rot_test },
|
| - { "-ROT", rrot_test },
|
| - { "2SWAP", swap2_test },
|
| - { "2DUP", dup2_test },
|
| - { "2OVER", over2_test },
|
| - { "2DROP", drop2_test },
|
| -
|
| - { "+", iadd_test },
|
| - { "-", isub_test },
|
| - { "*", imul_test },
|
| - { "/", idiv_test },
|
| - { "MOD", imod_test },
|
| - { "/MOD", idivmod_test },
|
| -
|
| -// { ".", idot_test },
|
| - { "ABS", iabs_test },
|
| - { "NEGATE", inegate_test },
|
| - { "MIN", imin_test },
|
| - { "MAX", imax_test },
|
| -
|
| - { "AND", logical_and_test },
|
| - { "OR", logical_or_test },
|
| - { "0=", logical_not_test },
|
| - { "?DUP", if_dup_test },
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -void Reporter::reportFailure(const char expression[], const char file[],
|
| - int line) {
|
| - SkDebugf("failed %s:%d: %s\n", file, line, expression);
|
| - fFailureCount += 1;
|
| -}
|
| -
|
| -void Reporter::reportFailure(const char msg[]) {
|
| - SkDebugf("%s\n");
|
| - fFailureCount += 1;
|
| -}
|
| -
|
| -void Forth_test_stdwords(bool verbose);
|
| -void Forth_test_stdwords(bool verbose) {
|
| - ForthEnv env;
|
| - Reporter reporter;
|
| -
|
| - for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
|
| - ForthEngine engine(NULL);
|
| -
|
| - ForthWord* word = env.findWord(gRecs[i].fName);
|
| - if (NULL == word) {
|
| - SkString str;
|
| - str.printf("--- can't find stdword %d", gRecs[i].fName);
|
| - reporter.reportFailure(str.c_str());
|
| - } else {
|
| - if (verbose) {
|
| - SkDebugf("--- testing %s %p\n", gRecs[i].fName, word);
|
| - }
|
| - gRecs[i].fProc(word, &engine, &reporter);
|
| - }
|
| - }
|
| -
|
| - if (0 == reporter.fFailureCount) {
|
| - SkDebugf("--- success!\n");
|
| - } else {
|
| - SkDebugf("--- %d failures\n", reporter.fFailureCount);
|
| - }
|
| -}
|
|
|