// Copyright (c) 2009 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "brillo/glib/object.h" #include <gtest/gtest.h> #include <algorithm> #include <cstring> #include <iterator> #include <string> using brillo::glib::ScopedPtrArray; using brillo::glib::ScopedError; using brillo::glib::Retrieve; using brillo::glib::Value; using brillo::Resetter; namespace { // NOLINT template <typename T> void SetRetrieveTest(const T& x) { Value tmp(x); T result; EXPECT_TRUE(Retrieve(tmp, &result)); EXPECT_EQ(result, x); } void ModifyValue(Value* x) { *x = 1.0 / 1231415926.0; // An unlikely value } template <typename T, typename O> void MutableRegularTestValue(const T& x, O modify) { Value tmp(x); Value y = tmp; // copy-construction T result; EXPECT_TRUE(Retrieve(y, &result)); EXPECT_EQ(result, x); modify(&y); LOG(INFO) << "Warning Expected."; EXPECT_TRUE(!(Retrieve(y, &result) && result == x)); y = tmp; // assignment EXPECT_TRUE(Retrieve(y, &result)); EXPECT_EQ(result, x); modify(&y); LOG(INFO) << "Warning Expected."; EXPECT_TRUE(!(Retrieve(y, &result) && result == x)); } void OutArgument(int** x) { *x = new int(10); // NOLINT } } // namespace TEST(ResetterTest, All) { std::unique_ptr<int> x; OutArgument(&Resetter(&x).lvalue()); EXPECT_EQ(*x, 10); } TEST(RetrieveTest, Types) { SetRetrieveTest(std::string("Hello!")); SetRetrieveTest(static_cast<uint32_t>(10)); SetRetrieveTest(10.5); SetRetrieveTest(true); } TEST(ValueTest, All) { Value x; // default construction Value y = x; // copy with default value x = y; // assignment with default value Value z(1.5); x = z; // assignment to default value MutableRegularTestValue(std::string("Hello!"), &ModifyValue); } TEST(ScopedErrorTest, All) { ScopedError a; // default construction ScopedError b(::g_error_new(::g_quark_from_static_string("error"), -1, "")); // constructor ::GError* c = ::g_error_new(::g_quark_from_static_string("error"), -1, ""); ::GError* d = ::g_error_new(::g_quark_from_static_string("error"), -1, ""); a.reset(c); // reset form 1 (void)d; } TEST(ScopedPtrArrayTest, Construction) { const char item[] = "a string"; char* a = static_cast<char*>(::g_malloc(sizeof(item))); std::strcpy(a, &item[0]); // NOLINT ::GPtrArray* array = ::g_ptr_array_new(); ::g_ptr_array_add(array, ::gpointer(a)); ScopedPtrArray<const char*> x(array); EXPECT_EQ(x.size(), 1); EXPECT_EQ(x[0], a); // indexing } TEST(ScopedPtrArrayTest, Reset) { const char item[] = "a string"; char* a = static_cast<char*>(::g_malloc(sizeof(item))); std::strcpy(a, &item[0]); // NOLINT ScopedPtrArray<const char*> x; // default construction x.push_back(a); EXPECT_EQ(x.size(), 1); x.reset(); EXPECT_EQ(x.size(), 0); char* b = static_cast<char*>(::g_malloc(sizeof(item))); std::strcpy(b, &item[0]); // NOLINT ::GPtrArray* array = ::g_ptr_array_new(); ::g_ptr_array_add(array, ::gpointer(b)); x.reset(array); EXPECT_EQ(x.size(), 1); } TEST(ScopedPtrArrayTest, Iteration) { char* a[] = { static_cast<char*>(::g_malloc(1)), static_cast<char*>(::g_malloc(1)), static_cast<char*>(::g_malloc(1)) }; ScopedPtrArray<const char*> x; std::copy(&a[0], &a[3], std::back_inserter(x)); EXPECT_TRUE(std::equal(x.begin(), x.end(), &a[0])); }