Home | History | Annotate | Download | only in tests
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "Test.h"
      9 #include "SkRefDict.h"
     10 
     11 class TestRC : public SkRefCnt {
     12 public:
     13     SK_DECLARE_INST_COUNT(TestRC)
     14 private:
     15     typedef SkRefCnt INHERITED;
     16 };
     17 
     18 SK_DEFINE_INST_COUNT(TestRC)
     19 
     20 static void TestRefDict(skiatest::Reporter* reporter) {
     21     TestRC    data0, data1;
     22     SkRefDict dict;
     23 
     24     REPORTER_ASSERT(reporter, NULL == dict.find(NULL));
     25     REPORTER_ASSERT(reporter, NULL == dict.find("foo"));
     26     REPORTER_ASSERT(reporter, NULL == dict.find("bar"));
     27 
     28     dict.set("foo", &data0);
     29     REPORTER_ASSERT(reporter, &data0 == dict.find("foo"));
     30     REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
     31 
     32     dict.set("foo", &data0);
     33     REPORTER_ASSERT(reporter, &data0 == dict.find("foo"));
     34     REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
     35 
     36     dict.set("foo", &data1);
     37     REPORTER_ASSERT(reporter, &data1 == dict.find("foo"));
     38     REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
     39     REPORTER_ASSERT(reporter, 2 == data1.getRefCnt());
     40 
     41     dict.set("foo", NULL);
     42     REPORTER_ASSERT(reporter, NULL == dict.find("foo"));
     43     REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
     44     REPORTER_ASSERT(reporter, 1 == data1.getRefCnt());
     45 
     46     dict.set("foo", &data0);
     47     dict.set("bar", &data1);
     48     REPORTER_ASSERT(reporter, &data0 == dict.find("foo"));
     49     REPORTER_ASSERT(reporter, &data1 == dict.find("bar"));
     50     REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
     51     REPORTER_ASSERT(reporter, 2 == data1.getRefCnt());
     52 
     53     dict.set("foo", &data1);
     54     REPORTER_ASSERT(reporter, &data1 == dict.find("foo"));
     55     REPORTER_ASSERT(reporter, &data1 == dict.find("bar"));
     56     REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
     57     REPORTER_ASSERT(reporter, 3 == data1.getRefCnt());
     58 
     59     dict.removeAll();
     60     REPORTER_ASSERT(reporter, NULL == dict.find("foo"));
     61     REPORTER_ASSERT(reporter, NULL == dict.find("bar"));
     62     REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
     63     REPORTER_ASSERT(reporter, 1 == data1.getRefCnt());
     64 
     65     {
     66         SkRefDict d;
     67         REPORTER_ASSERT(reporter, NULL == d.find("foo"));
     68         REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
     69         d.set("foo", &data0);
     70         REPORTER_ASSERT(reporter, &data0 == d.find("foo"));
     71         REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
     72         // let d go out of scope still with a ref on data0
     73     }
     74     // be sure d's destructor lowered data0's owner count back to 1
     75     REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
     76 }
     77 
     78 #include "TestClassDef.h"
     79 DEFINE_TESTCLASS("RefDict", RefDictTestClass, TestRefDict)
     80