// Copyright 2015 The Chromium 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 "base/memory/ref_counted.h"
#include "base/strings/utf_string_conversions.h"
#include "extensions/browser/api/device_permissions_prompt.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_builder.h"
#include "extensions/common/value_builder.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace extensions {

namespace {

class DevicePermissionsPromptTest : public testing::Test {};

TEST_F(DevicePermissionsPromptTest, HidPromptMessages) {
  scoped_refptr<Extension> extension =
      ExtensionBuilder()
          .SetManifest(DictionaryBuilder()
                           .Set("name", "Test Application")
                           .Set("manifest_version", 2)
                           .Set("version", "1.0"))
          .Build();

  scoped_refptr<DevicePermissionsPrompt::Prompt> prompt =
      DevicePermissionsPrompt::CreateHidPromptForTest(extension.get(), false);
  EXPECT_EQ(base::ASCIIToUTF16("Select a HID device"), prompt->GetHeading());
  EXPECT_EQ(
      base::ASCIIToUTF16(
          "The application \"Test Application\" is requesting access to one of "
          "your devices."),
      prompt->GetPromptMessage());

  prompt =
      DevicePermissionsPrompt::CreateHidPromptForTest(extension.get(), true);
  EXPECT_EQ(base::ASCIIToUTF16("Select HID devices"), prompt->GetHeading());
  EXPECT_EQ(
      base::ASCIIToUTF16(
          "The application \"Test Application\" is requesting access to one or "
          "more of your devices."),
      prompt->GetPromptMessage());
}

TEST_F(DevicePermissionsPromptTest, UsbPromptMessages) {
  scoped_refptr<Extension> extension =
      ExtensionBuilder()
          .SetManifest(DictionaryBuilder()
                           .Set("name", "Test Application")
                           .Set("manifest_version", 2)
                           .Set("version", "1.0"))
          .Build();

  scoped_refptr<DevicePermissionsPrompt::Prompt> prompt =
      DevicePermissionsPrompt::CreateUsbPromptForTest(extension.get(), false);
  EXPECT_EQ(base::ASCIIToUTF16("Select a USB device"), prompt->GetHeading());
  EXPECT_EQ(
      base::ASCIIToUTF16(
          "The application \"Test Application\" is requesting access to one of "
          "your devices."),
      prompt->GetPromptMessage());

  prompt =
      DevicePermissionsPrompt::CreateUsbPromptForTest(extension.get(), true);
  EXPECT_EQ(base::ASCIIToUTF16("Select USB devices"), prompt->GetHeading());
  EXPECT_EQ(
      base::ASCIIToUTF16(
          "The application \"Test Application\" is requesting access to one or "
          "more of your devices."),
      prompt->GetPromptMessage());
}

}  // namespace

}  // namespace extensions
