// Copyright 2013 The Flutter 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 "flutter/lib/ui/semantics/semantics_update_builder.h"
#include "flutter/shell/common/shell_test.h"

#include "gtest/gtest.h"

namespace flutter {
namespace testing {

using SemanticsUpdateBuilderTest = ShellTest;

TEST_F(SemanticsUpdateBuilderTest, CanHandleAttributedStrings) {
  auto message_latch = std::make_shared<fml::AutoResetWaitableEvent>();

  auto nativeSemanticsUpdate = [message_latch](Dart_NativeArguments args) {
    auto handle = Dart_GetNativeArgument(args, 0);
    intptr_t peer = 0;
    Dart_Handle result = Dart_GetNativeInstanceField(
        handle, tonic::DartWrappable::kPeerIndex, &peer);
    ASSERT_FALSE(Dart_IsError(result));
    SemanticsUpdate* update = reinterpret_cast<SemanticsUpdate*>(peer);
    SemanticsNodeUpdates nodes = update->takeNodes();
    ASSERT_EQ(nodes.size(), (size_t)1);
    auto node = nodes.find(0)->second;
    // Should match the updateNode in ui_test.dart.
    ASSERT_EQ(node.label, "label");
    ASSERT_EQ(node.labelAttributes.size(), (size_t)1);
    ASSERT_EQ(node.labelAttributes[0]->start, 1);
    ASSERT_EQ(node.labelAttributes[0]->end, 2);
    ASSERT_EQ(node.labelAttributes[0]->type, StringAttributeType::kSpellOut);

    ASSERT_EQ(node.value, "value");
    ASSERT_EQ(node.valueAttributes.size(), (size_t)1);
    ASSERT_EQ(node.valueAttributes[0]->start, 2);
    ASSERT_EQ(node.valueAttributes[0]->end, 3);
    ASSERT_EQ(node.valueAttributes[0]->type, StringAttributeType::kSpellOut);

    ASSERT_EQ(node.hint, "hint");
    ASSERT_EQ(node.hintAttributes.size(), (size_t)1);
    ASSERT_EQ(node.hintAttributes[0]->start, 0);
    ASSERT_EQ(node.hintAttributes[0]->end, 1);
    ASSERT_EQ(node.hintAttributes[0]->type, StringAttributeType::kLocale);
    auto local_attribute =
        std::static_pointer_cast<LocaleStringAttribute>(node.hintAttributes[0]);
    ASSERT_EQ(local_attribute->locale, "en-MX");

    ASSERT_EQ(node.increasedValue, "increasedValue");
    ASSERT_EQ(node.increasedValueAttributes.size(), (size_t)1);
    ASSERT_EQ(node.increasedValueAttributes[0]->start, 4);
    ASSERT_EQ(node.increasedValueAttributes[0]->end, 5);
    ASSERT_EQ(node.increasedValueAttributes[0]->type,
              StringAttributeType::kSpellOut);

    ASSERT_EQ(node.decreasedValue, "decreasedValue");
    ASSERT_EQ(node.decreasedValueAttributes.size(), (size_t)1);
    ASSERT_EQ(node.decreasedValueAttributes[0]->start, 5);
    ASSERT_EQ(node.decreasedValueAttributes[0]->end, 6);
    ASSERT_EQ(node.decreasedValueAttributes[0]->type,
              StringAttributeType::kSpellOut);
    message_latch->Signal();
  };

  Settings settings = CreateSettingsForFixture();
  TaskRunners task_runners("test",                  // label
                           GetCurrentTaskRunner(),  // platform
                           CreateNewThread(),       // raster
                           CreateNewThread(),       // ui
                           CreateNewThread()        // io
  );

  AddNativeCallback("SemanticsUpdate",
                    CREATE_NATIVE_ENTRY(nativeSemanticsUpdate));

  std::unique_ptr<Shell> shell =
      CreateShell(std::move(settings), std::move(task_runners));

  ASSERT_TRUE(shell->IsSetup());
  auto configuration = RunConfiguration::InferFromSettings(settings);
  configuration.SetEntrypoint("sendSemanticsUpdate");

  shell->RunEngine(std::move(configuration), [](auto result) {
    ASSERT_EQ(result, Engine::RunStatus::Success);
  });

  message_latch->Wait();
  DestroyShell(std::move(shell), std::move(task_runners));
}

}  // namespace testing
}  // namespace flutter
