11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "Test.h"
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkRefDict.h"
1005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass TestRC : public SkRefCnt {
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic void TestRefDict(skiatest::Reporter* reporter) {
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    TestRC    data0, data1;
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkRefDict dict;
1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, NULL == dict.find(NULL));
1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, NULL == dict.find("foo"));
2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, NULL == dict.find("bar"));
2105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    dict.set("foo", &data0);
2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, &data0 == dict.find("foo"));
2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    dict.set("foo", &data0);
2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, &data0 == dict.find("foo"));
2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    dict.set("foo", &data1);
3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, &data1 == dict.find("foo"));
3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 2 == data1.getRefCnt());
3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    dict.set("foo", NULL);
3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, NULL == dict.find("foo"));
3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 1 == data1.getRefCnt());
3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    dict.set("foo", &data0);
4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    dict.set("bar", &data1);
4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, &data0 == dict.find("foo"));
4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, &data1 == dict.find("bar"));
4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 2 == data1.getRefCnt());
4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    dict.set("foo", &data1);
4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, &data1 == dict.find("foo"));
4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, &data1 == dict.find("bar"));
5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 3 == data1.getRefCnt());
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    dict.removeAll();
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, NULL == dict.find("foo"));
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, NULL == dict.find("bar"));
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 1 == data1.getRefCnt());
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    {
6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkRefDict d;
6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        REPORTER_ASSERT(reporter, NULL == d.find("foo"));
6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        d.set("foo", &data0);
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        REPORTER_ASSERT(reporter, &data0 == d.find("foo"));
6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        REPORTER_ASSERT(reporter, 2 == data0.getRefCnt());
6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        // let d go out of scope still with a ref on data0
6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // be sure d's destructor lowered data0's owner count back to 1
6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    REPORTER_ASSERT(reporter, 1 == data0.getRefCnt());
7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "TestClassDef.h"
7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerDEFINE_TESTCLASS("RefDict", RefDictTestClass, TestRefDict)
74