Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2013 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkOnce.h"
      9 #include "SkTaskGroup.h"
     10 #include "Test.h"
     11 
     12 static void add_five(int* x) {
     13     *x += 5;
     14 }
     15 
     16 DEF_TEST(SkOnce_Singlethreaded, r) {
     17     int x = 0;
     18 
     19     // No matter how many times we do this, x will be 5.
     20     SkOnce once;
     21     once(add_five, &x);
     22     once(add_five, &x);
     23     once(add_five, &x);
     24     once(add_five, &x);
     25     once(add_five, &x);
     26 
     27     REPORTER_ASSERT(r, 5 == x);
     28 }
     29 
     30 DEF_TEST(SkOnce_Multithreaded, r) {
     31     int x = 0;
     32 
     33     // Run a bunch of tasks to be the first to add six to x.
     34     SkOnce once;
     35     SkTaskGroup().batch(1021, [&](int) {
     36         once([&] { x += 6; });
     37     });
     38 
     39     // Only one should have done the +=.
     40     REPORTER_ASSERT(r, 6 == x);
     41 }
     42 
     43 static int gX = 0;
     44 static void inc_gX() { gX++; }
     45 
     46 DEF_TEST(SkOnce_NoArg, r) {
     47     SkOnce once;
     48     once(inc_gX);
     49     once(inc_gX);
     50     once(inc_gX);
     51     REPORTER_ASSERT(r, 1 == gX);
     52 }
     53