175e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com/*
275e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com * Copyright 2013 Google Inc.
375e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com *
475e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com * Use of this source code is governed by a BSD-style license that can be
575e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com * found in the LICENSE file.
675e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com */
7e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.org
875e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com#include "SkError.h"
975e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com#include "SkPath.h"
1075e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com#include "SkRect.h"
118f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
1275e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com
13c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.orgtypedef struct {
14c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org    skiatest::Reporter *fReporter;
15c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org    unsigned int *fIntPointer;
16c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org} ErrorContext;
17c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org
1875e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com#define CHECK(errcode)                                                        \
1975e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com  REPORTER_ASSERT( reporter, (err = SkGetLastError()) == errcode);            \
2075e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com  if (err != kNoError_SkError)                                                \
2175e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com  {                                                                           \
2275e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com     SkClearLastError();                                                      \
2375e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com  }
243284017a60ea4fc3dc5b95838ba0c301ee1e4e8dskia.committer@gmail.com
258e029e6e59024b80e8f71924369a540699754de3humper@google.comstatic void cb(SkError err, void *context) {
26c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org    ErrorContext *context_ptr = static_cast<ErrorContext *>(context);
27c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org    REPORTER_ASSERT( context_ptr->fReporter, (*(context_ptr->fIntPointer) == 0xdeadbeef) );
2875e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com}
2975e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com
30e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Error, reporter) {
31fbe4136845fd68f583f9f9bfb628706c4b87480bmtklein    // Some previous user of this thread may have left an error laying around.
32fbe4136845fd68f583f9f9bfb628706c4b87480bmtklein    SkClearLastError();
33fbe4136845fd68f583f9f9bfb628706c4b87480bmtklein
3475e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    SkError err;
35f91e3d4f54de9976b6538decadd977b19e49eaddskia.committer@gmail.com
36c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org    unsigned int test_value = 0xdeadbeef;
37c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org    ErrorContext context;
38c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org    context.fReporter = reporter;
39c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org    context.fIntPointer = &test_value;
40f91e3d4f54de9976b6538decadd977b19e49eaddskia.committer@gmail.com
41c5e57bd0a3e1b3b8d2d11307c6de1886656ca9fdcommit-bot@chromium.org    SkSetErrorCallback(cb, &context);
423284017a60ea4fc3dc5b95838ba0c301ee1e4e8dskia.committer@gmail.com
4375e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    CHECK(kNoError_SkError);
443284017a60ea4fc3dc5b95838ba0c301ee1e4e8dskia.committer@gmail.com
4575e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    SkRect r = SkRect::MakeWH(50, 100);
4675e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    CHECK(kNoError_SkError);
4775e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com
4875e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    SkPath path;
4975e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    path.addRect(r);
5075e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    CHECK(kNoError_SkError);
513284017a60ea4fc3dc5b95838ba0c301ee1e4e8dskia.committer@gmail.com
5275e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    path.addRoundRect(r, 10, 10);
5375e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    CHECK(kNoError_SkError);
5475e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com
5575e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    // should trigger the default error callback, which just prints to the screen.
5675e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    path.addRoundRect(r, -10, -10);
5775e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    CHECK(kInvalidArgument_SkError);
5875e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    CHECK(kNoError_SkError);
5975e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com
6075e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    // should trigger *our* callback.
6175e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    path.addRoundRect(r, -10, -10);
6275e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    CHECK(kInvalidArgument_SkError);
6375e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com    CHECK(kNoError_SkError);
6475e3ca127cd14fffc9c8df7ea03d6529fb001831humper@google.com}
65