bluetooth_device_list_item_multiple_battery_view_unittest.cc 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/system/bluetooth/bluetooth_device_list_item_multiple_battery_view.h"
  5. #include "ash/constants/ash_features.h"
  6. #include "ash/resources/vector_icons/vector_icons.h"
  7. #include "ash/strings/grit/ash_strings.h"
  8. #include "ash/test/ash_test_base.h"
  9. #include "base/strings/string_number_conversions.h"
  10. #include "base/test/scoped_feature_list.h"
  11. #include "chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom.h"
  12. #include "third_party/abseil-cpp/absl/types/optional.h"
  13. #include "ui/base/l10n/l10n_util.h"
  14. #include "ui/gfx/image/image_skia.h"
  15. #include "ui/gfx/image/image_unittest_util.h"
  16. #include "ui/views/controls/image_view.h"
  17. #include "ui/views/controls/label.h"
  18. #include "ui/views/widget/widget.h"
  19. namespace ash {
  20. namespace {
  21. using chromeos::bluetooth_config::mojom::BatteryProperties;
  22. using chromeos::bluetooth_config::mojom::BatteryPropertiesPtr;
  23. using chromeos::bluetooth_config::mojom::DeviceBatteryInfo;
  24. using chromeos::bluetooth_config::mojom::DeviceBatteryInfoPtr;
  25. DeviceBatteryInfoPtr CreateBatteryInfo(
  26. absl::optional<uint8_t> left_battery_percentage,
  27. absl::optional<uint8_t> case_battery_percentage,
  28. absl::optional<uint8_t> right_battery_percentage) {
  29. DeviceBatteryInfoPtr battery_info = DeviceBatteryInfo::New();
  30. if (left_battery_percentage) {
  31. battery_info->left_bud_info = BatteryProperties::New();
  32. battery_info->left_bud_info->battery_percentage =
  33. left_battery_percentage.value();
  34. }
  35. if (case_battery_percentage) {
  36. battery_info->case_info = BatteryProperties::New();
  37. battery_info->case_info->battery_percentage =
  38. case_battery_percentage.value();
  39. }
  40. if (right_battery_percentage) {
  41. battery_info->right_bud_info = BatteryProperties::New();
  42. battery_info->right_bud_info->battery_percentage =
  43. right_battery_percentage.value();
  44. }
  45. return battery_info;
  46. }
  47. } // namespace
  48. class BluetoothDeviceListItemMultipleBatteryViewTest : public AshTestBase {
  49. public:
  50. void SetUp() override {
  51. AshTestBase::SetUp();
  52. feature_list_.InitAndEnableFeature(features::kBluetoothRevamp);
  53. widget_ = CreateTestWidget();
  54. bluetooth_device_list_multiple_battery_item_ =
  55. std::make_unique<BluetoothDeviceListItemMultipleBatteryView>();
  56. // Add the item to widget hierarchy to make sure `ui::ColorProvider` will
  57. // not be nullptr while getting colors.
  58. widget_->GetContentsView()->AddChildView(
  59. bluetooth_device_list_multiple_battery_item_.get());
  60. }
  61. void TearDown() override {
  62. bluetooth_device_list_multiple_battery_item_.reset();
  63. AshTestBase::TearDown();
  64. }
  65. BluetoothDeviceListItemMultipleBatteryView*
  66. bluetooth_device_list_multiple_battery_item() {
  67. return bluetooth_device_list_multiple_battery_item_.get();
  68. }
  69. views::Label* GetLabel(int index) {
  70. EXPECT_EQ(2u, bluetooth_device_list_multiple_battery_item()
  71. ->children()
  72. .at(index)
  73. ->children()
  74. .size());
  75. return static_cast<views::Label*>(
  76. bluetooth_device_list_multiple_battery_item()
  77. ->children()
  78. .at(index)
  79. ->children()
  80. .at(1));
  81. }
  82. void BatteryViewExistsAtIndex(int index) {
  83. EXPECT_EQ(bluetooth_device_list_multiple_battery_item()
  84. ->children()
  85. .at(index)
  86. ->GetClassName(),
  87. BluetoothDeviceListItemBatteryView::kViewClassName);
  88. }
  89. private:
  90. base::test::ScopedFeatureList feature_list_;
  91. std::unique_ptr<views::Widget> widget_;
  92. std::unique_ptr<BluetoothDeviceListItemMultipleBatteryView>
  93. bluetooth_device_list_multiple_battery_item_;
  94. };
  95. TEST_F(BluetoothDeviceListItemMultipleBatteryViewTest,
  96. MultipleCorrectlyUpdatesIconAndLabel_OneBattery) {
  97. EXPECT_EQ(0u,
  98. bluetooth_device_list_multiple_battery_item()->children().size());
  99. DeviceBatteryInfoPtr battery_info =
  100. CreateBatteryInfo(/*left_battery_percentage=*/100,
  101. /*case_battery_percentage=*/absl::nullopt,
  102. /*right_battery_percentage=*/absl::nullopt);
  103. bluetooth_device_list_multiple_battery_item()->UpdateBatteryInfo(
  104. battery_info);
  105. EXPECT_EQ(1u,
  106. bluetooth_device_list_multiple_battery_item()->children().size());
  107. BatteryViewExistsAtIndex(/*index=*/0);
  108. }
  109. TEST_F(BluetoothDeviceListItemMultipleBatteryViewTest,
  110. CorrectlyUpdatesIconAndLabel_TwoBatteries) {
  111. EXPECT_EQ(0u,
  112. bluetooth_device_list_multiple_battery_item()->children().size());
  113. DeviceBatteryInfoPtr battery_info = CreateBatteryInfo(
  114. /*left_battery_percentage=*/100, /*case_battery_percentage=*/100,
  115. /*right_battery_percentage=*/absl::nullopt);
  116. bluetooth_device_list_multiple_battery_item()->UpdateBatteryInfo(
  117. battery_info);
  118. EXPECT_EQ(2u,
  119. bluetooth_device_list_multiple_battery_item()->children().size());
  120. BatteryViewExistsAtIndex(/*index=*/0);
  121. BatteryViewExistsAtIndex(/*index=*/1);
  122. }
  123. TEST_F(BluetoothDeviceListItemMultipleBatteryViewTest,
  124. CorrectlyUpdatesIconAndLabel_BatteryRemoved) {
  125. EXPECT_EQ(0u,
  126. bluetooth_device_list_multiple_battery_item()->children().size());
  127. DeviceBatteryInfoPtr battery_info = CreateBatteryInfo(
  128. /*left_battery_percentage=*/100, /*case_battery_percentage=*/100,
  129. /*right_battery_percentage=*/100);
  130. bluetooth_device_list_multiple_battery_item()->UpdateBatteryInfo(
  131. battery_info);
  132. EXPECT_EQ(3u,
  133. bluetooth_device_list_multiple_battery_item()->children().size());
  134. BatteryViewExistsAtIndex(/*index=*/0);
  135. BatteryViewExistsAtIndex(/*index=*/1);
  136. BatteryViewExistsAtIndex(/*index=*/2);
  137. EXPECT_EQ(
  138. l10n_util::GetStringFUTF16(
  139. IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_BATTERY_PERCENTAGE_LEFT_BUD_LABEL,
  140. base::NumberToString16(
  141. battery_info->left_bud_info->battery_percentage)),
  142. GetLabel(/*index=*/0)->GetText());
  143. EXPECT_EQ(
  144. l10n_util::GetStringFUTF16(
  145. IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_BATTERY_PERCENTAGE_CASE_LABEL,
  146. base::NumberToString16(battery_info->case_info->battery_percentage)),
  147. GetLabel(/*index=*/1)->GetText());
  148. EXPECT_EQ(
  149. l10n_util::GetStringFUTF16(
  150. IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_BATTERY_PERCENTAGE_RIGHT_BUD_LABEL,
  151. base::NumberToString16(
  152. battery_info->right_bud_info->battery_percentage)),
  153. GetLabel(/*index=*/2)->GetText());
  154. DeviceBatteryInfoPtr battery_info2 = CreateBatteryInfo(
  155. /*left_battery_percentage=*/absl::nullopt,
  156. /*case_battery_percentage=*/100, /*right_battery_percentage=*/100);
  157. bluetooth_device_list_multiple_battery_item()->UpdateBatteryInfo(
  158. battery_info2);
  159. EXPECT_EQ(2u,
  160. bluetooth_device_list_multiple_battery_item()->children().size());
  161. BatteryViewExistsAtIndex(/*index=*/0);
  162. BatteryViewExistsAtIndex(/*index=*/1);
  163. EXPECT_EQ(
  164. l10n_util::GetStringFUTF16(
  165. IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_BATTERY_PERCENTAGE_CASE_LABEL,
  166. base::NumberToString16(battery_info2->case_info->battery_percentage)),
  167. GetLabel(/*index=*/0)->GetText());
  168. EXPECT_EQ(
  169. l10n_util::GetStringFUTF16(
  170. IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_BATTERY_PERCENTAGE_RIGHT_BUD_LABEL,
  171. base::NumberToString16(
  172. battery_info2->right_bud_info->battery_percentage)),
  173. GetLabel(/*index=*/1)->GetText());
  174. DeviceBatteryInfoPtr battery_info3 = CreateBatteryInfo(
  175. /*left_battery_percentage=*/100, /*case_battery_percentage=*/100,
  176. /*right_battery_percentage=*/100);
  177. bluetooth_device_list_multiple_battery_item()->UpdateBatteryInfo(
  178. battery_info3);
  179. EXPECT_EQ(3u,
  180. bluetooth_device_list_multiple_battery_item()->children().size());
  181. BatteryViewExistsAtIndex(/*index=*/0);
  182. BatteryViewExistsAtIndex(/*index=*/1);
  183. BatteryViewExistsAtIndex(/*index=*/2);
  184. EXPECT_EQ(
  185. l10n_util::GetStringFUTF16(
  186. IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_BATTERY_PERCENTAGE_LEFT_BUD_LABEL,
  187. base::NumberToString16(
  188. battery_info3->left_bud_info->battery_percentage)),
  189. GetLabel(/*index=*/0)->GetText());
  190. EXPECT_EQ(
  191. l10n_util::GetStringFUTF16(
  192. IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_BATTERY_PERCENTAGE_CASE_LABEL,
  193. base::NumberToString16(battery_info3->case_info->battery_percentage)),
  194. GetLabel(/*index=*/1)->GetText());
  195. EXPECT_EQ(
  196. l10n_util::GetStringFUTF16(
  197. IDS_ASH_STATUS_TRAY_BLUETOOTH_DEVICE_BATTERY_PERCENTAGE_RIGHT_BUD_LABEL,
  198. base::NumberToString16(
  199. battery_info3->right_bud_info->battery_percentage)),
  200. GetLabel(/*index=*/2)->GetText());
  201. }
  202. } // namespace ash