1/* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15#include <gtest/gtest.h> 16#include "observer.h" 17#include <algorithm> 18#include <iostream> 19#include <fstream> 20using namespace testing::ext; 21using namespace std; 22 23namespace OHOS { 24namespace { 25class BookList: public Observable { 26public: 27 BookList() { books_.clear(); } 28 void AddBook(const string& book) 29 { 30 books_.insert(book); 31 SetChanged(); 32 NotifyObservers(); 33 } 34 35 void RemoveBook(const string& book) 36 { 37 books_.erase(book); 38 SetChanged(); 39 NotifyObservers(); 40 } 41 42 void NoChangeNotify() 43 { 44 if (HasChanged() == false) { 45 NotifyObservers(); 46 } 47 } 48 49 const set<string>& GetBooks() { return books_; } 50private: 51 set<string> books_; 52 53}; 54 55class BookObserver: public Observer { 56public: 57 virtual void Update(const Observable* o, const ObserverArg* /* arg */) 58 { 59 BookList* bookList = reinterpret_cast<BookList*>(const_cast<Observable*>(o)); 60 books_ = bookList->GetBooks(); 61 } 62 63 int GetBooksCount() { return static_cast<int>(books_.size()); } 64 bool BookExists(const string& book) { return books_.count(book) > 0;} 65private: 66 set<string> books_; 67}; 68 69 70class UtilsObserverTest : public testing::Test { 71public : 72 static void SetUpTestCase(void); 73 static void TearDownTestCase(void); 74 void SetUp(); 75 void TearDown(); 76}; 77 78void UtilsObserverTest::SetUpTestCase(void) 79{ 80} 81 82void UtilsObserverTest::TearDownTestCase(void) 83{ 84} 85 86void UtilsObserverTest::SetUp(void) 87{ 88} 89 90void UtilsObserverTest::TearDown(void) 91{ 92} 93 94/* 95 * @tc.name: test_Observer 96 * @tc.desc: Test add null or repeat observer to the observable object. 97 */ 98HWTEST_F(UtilsObserverTest, test_Observer, TestSize.Level0) 99{ 100 BookList bookList; 101 bookList.AddObserver(nullptr); 102 shared_ptr<BookObserver> bookObserver1 = make_shared<BookObserver>(); 103 bookList.AddObserver(bookObserver1); 104 bookList.AddObserver(bookObserver1); 105 bookList.NoChangeNotify(); 106 int ret = bookList.GetObserversCount(); 107 EXPECT_EQ(ret, 1); 108} 109 110HWTEST_F(UtilsObserverTest, test_ObserverNotify, TestSize.Level0) 111{ 112 BookList bookList; 113 shared_ptr<BookObserver> bookObserver1 = make_shared<BookObserver>(); 114 shared_ptr<BookObserver> bookObserver2 = make_shared<BookObserver>(); 115 shared_ptr<BookObserver> bookObserver3 = make_shared<BookObserver>(); 116 117 bookList.AddObserver(bookObserver1); 118 bookList.AddObserver(bookObserver2); 119 bookList.AddObserver(bookObserver3); 120 bookList.AddBook("book1"); 121 122 EXPECT_EQ(bookObserver1->GetBooksCount(), 1); 123 EXPECT_EQ(bookObserver2->GetBooksCount(), 1); 124 EXPECT_EQ(bookObserver3->GetBooksCount(), 1); 125 126 bookList.RemoveObserver(bookObserver1); 127 bookList.RemoveBook("book1"); 128 EXPECT_EQ(bookObserver1->GetBooksCount(), 1); 129 EXPECT_EQ(bookObserver2->GetBooksCount(), 0); 130 EXPECT_EQ(bookObserver3->GetBooksCount(), 0); 131 132 bookList.RemoveObserver(bookObserver2); 133 bookList.AddBook("book2"); 134 bookList.AddBook("book3"); 135 EXPECT_EQ(bookObserver1->GetBooksCount(), 1); 136 EXPECT_EQ(bookObserver2->GetBooksCount(), 0); 137 EXPECT_EQ(bookObserver3->GetBooksCount(), 2); 138 139} 140 141 142HWTEST_F(UtilsObserverTest, test_RemoveAllObserver, TestSize.Level0) 143{ 144 BookList bookList; 145 shared_ptr<BookObserver> bookObserver1 = make_shared<BookObserver>(); 146 shared_ptr<BookObserver> bookObserver2 = make_shared<BookObserver>(); 147 shared_ptr<BookObserver> bookObserver3 = make_shared<BookObserver>(); 148 149 bookList.AddObserver(bookObserver1); 150 bookList.AddObserver(bookObserver2); 151 bookList.AddObserver(bookObserver3); 152 bookList.AddBook("book1"); 153 154 EXPECT_EQ(bookObserver1->GetBooksCount(), 1); 155 EXPECT_EQ(bookObserver2->GetBooksCount(), 1); 156 EXPECT_EQ(bookObserver3->GetBooksCount(), 1); 157 158 bookList.RemoveAllObservers(); 159 bookList.RemoveBook("book1"); 160 EXPECT_EQ(bookObserver1->GetBooksCount(), 1); 161 EXPECT_EQ(bookObserver2->GetBooksCount(), 1); 162 EXPECT_EQ(bookObserver3->GetBooksCount(), 1); 163 EXPECT_EQ(bookList.GetObserversCount(), 0); 164} 165} // namespace 166} // namespace OHOS