180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "Test.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRefDict.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass TestRC : public SkRefCnt {
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_DECLARE_INST_COUNT(TestRC)
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkRefCnt INHERITED;
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSK_DEFINE_INST_COUNT(TestRC)
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void TestRefDict(skiatest::Reporter* reporter) {
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    TestRC    data0, data1;
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkRefDict dict;
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, NULL == dict.find(NULL));
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, NULL == dict.find("foo"));
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, NULL == dict.find("bar"));
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dict.set("foo", &data0);
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, &data0 == dict.find("foo"));
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dict.set("foo", &data0);
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, &data0 == dict.find("foo"));
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dict.set("foo", &data1);
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, &data1 == dict.find("foo"));
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 2 == data1.getRefCnt());
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dict.set("foo", NULL);
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, NULL == dict.find("foo"));
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 1 == data1.getRefCnt());
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dict.set("foo", &data0);
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dict.set("bar", &data1);
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, &data0 == dict.find("foo"));
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, &data1 == dict.find("bar"));
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 2 == data1.getRefCnt());
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dict.set("foo", &data1);
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, &data1 == dict.find("foo"));
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, &data1 == dict.find("bar"));
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 3 == data1.getRefCnt());
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dict.removeAll();
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, NULL == dict.find("foo"));
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, NULL == dict.find("bar"));
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 1 == data1.getRefCnt());
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkRefDict d;
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        REPORTER_ASSERT(reporter, NULL == d.find("foo"));
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        d.set("foo", &data0);
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        REPORTER_ASSERT(reporter, &data0 == d.find("foo"));
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // let d go out of scope still with a ref on data0
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // be sure d's destructor lowered data0's owner count back to 1
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "TestClassDef.h"
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDEFINE_TESTCLASS("RefDict", RefDictTestClass, TestRefDict)
80