/* * Copyright 2017 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #import #include "sdk/objc/helpers/scoped_cftyperef.h" namespace { struct TestType { TestType() : has_value(true) {} TestType(bool b) : has_value(b) {} explicit operator bool() { return has_value; } bool has_value; int retain_count = 0; }; typedef TestType* TestTypeRef; struct TestTypeTraits { static TestTypeRef InvalidValue() { return TestTypeRef(false); } static void Release(TestTypeRef t) { t->retain_count--; } static TestTypeRef Retain(TestTypeRef t) { t->retain_count++; return t; } }; } // namespace using ScopedTestType = rtc::internal::ScopedTypeRef; // In these tests we sometime introduce variables just to // observe side-effects. Ignore the compilers complaints. #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-variable" @interface ScopedTypeRefTests : XCTestCase @end @implementation ScopedTypeRefTests - (void)testShouldNotRetainByDefault { TestType a; ScopedTestType ref(&a); XCTAssertEqual(0, a.retain_count); } - (void)testShouldRetainWithPolicy { TestType a; ScopedTestType ref(&a, rtc::RetainPolicy::RETAIN); XCTAssertEqual(1, a.retain_count); } - (void)testShouldReleaseWhenLeavingScope { TestType a; XCTAssertEqual(0, a.retain_count); { ScopedTestType ref(&a, rtc::RetainPolicy::RETAIN); XCTAssertEqual(1, a.retain_count); } XCTAssertEqual(0, a.retain_count); } - (void)testShouldBeCopyable { TestType a; XCTAssertEqual(0, a.retain_count); { ScopedTestType ref1(&a, rtc::RetainPolicy::RETAIN); XCTAssertEqual(1, a.retain_count); ScopedTestType ref2 = ref1; XCTAssertEqual(2, a.retain_count); } XCTAssertEqual(0, a.retain_count); } - (void)testCanReleaseOwnership { TestType a; XCTAssertEqual(0, a.retain_count); { ScopedTestType ref(&a, rtc::RetainPolicy::RETAIN); XCTAssertEqual(1, a.retain_count); TestTypeRef b = ref.release(); } XCTAssertEqual(1, a.retain_count); } - (void)testShouldBeTestableForTruthiness { ScopedTestType ref; XCTAssertFalse(ref); TestType a; ref = &a; XCTAssertTrue(ref); ref.release(); XCTAssertFalse(ref); } - (void)testShouldProvideAccessToWrappedType { TestType a; ScopedTestType ref(&a); XCTAssertEqual(&(a.retain_count), &(ref->retain_count)); } @end #pragma clang diagnostic pop