146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/*
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Copyright 2013 Google Inc.
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) *
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * found in the LICENSE file.
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "SkError.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "SkPath.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "SkRect.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "Test.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)typedef struct {
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    skiatest::Reporter *fReporter;
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    unsigned int *fIntPointer;
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} ErrorContext;
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define CHECK(errcode)                                                        \
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  REPORTER_ASSERT( reporter, (err = SkGetLastError()) == errcode);            \
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (err != kNoError_SkError)                                                \
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  {                                                                           \
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)     SkClearLastError();                                                      \
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void cb(SkError err, void *context) {
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ErrorContext *context_ptr = static_cast<ErrorContext *>(context);
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    REPORTER_ASSERT( context_ptr->fReporter, (*(context_ptr->fIntPointer) == 0xdeadbeef) );
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DEF_TEST(Error, reporter) {
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SkError err;
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    unsigned int test_value = 0xdeadbeef;
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ErrorContext context;
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    context.fReporter = reporter;
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    context.fIntPointer = &test_value;
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SkSetErrorCallback(cb, &context);
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    CHECK(kNoError_SkError);
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SkRect r = SkRect::MakeWH(50, 100);
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    CHECK(kNoError_SkError);
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SkPath path;
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    path.addRect(r);
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK(kNoError_SkError);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    path.addRoundRect(r, 10, 10);
50    CHECK(kNoError_SkError);
51
52    // should trigger the default error callback, which just prints to the screen.
53    path.addRoundRect(r, -10, -10);
54    CHECK(kInvalidArgument_SkError);
55    CHECK(kNoError_SkError);
56
57    // should trigger *our* callback.
58    path.addRoundRect(r, -10, -10);
59    CHECK(kInvalidArgument_SkError);
60    CHECK(kNoError_SkError);
61}
62