summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/sdk/objc/unittests/scoped_cftyperef_tests.mm
blob: a354410ede0cf01830dfd4a017e4c57d8bdf1cd8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
 *  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 <XCTest/XCTest.h>

#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<TestTypeRef, TestTypeTraits>;

// 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