// Copyright 2019 The Fuchsia 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 "src/developer/debug/zxdb/console/async_output_buffer.h"

#include <gtest/gtest.h>

#include "src/developer/debug/zxdb/common/err.h"

namespace zxdb {

TEST(AsyncOutputBuffer, Empty) {
  auto buf = fxl::MakeRefCounted<AsyncOutputBuffer>();
  EXPECT_FALSE(buf->is_complete());

  buf->Complete();
  EXPECT_TRUE(buf->is_complete());

  auto flat = buf->DestructiveFlatten();
  EXPECT_TRUE(flat.empty());
}

TEST(AsyncOutputBuffer, OneLevel) {
  auto buf = fxl::MakeRefCounted<AsyncOutputBuffer>();

  buf->Append("One ");
  buf->Complete("Two");
  EXPECT_TRUE(buf->is_complete());
  EXPECT_EQ("One Two", buf->DestructiveFlatten().AsString());
}

TEST(AsyncOutputBuffer, Sync) {
  auto level1 = fxl::MakeRefCounted<AsyncOutputBuffer>();

  level1->Append("[1 ");

  // Level 2 is appended before being marked complete.
  auto level2 = fxl::MakeRefCounted<AsyncOutputBuffer>();
  level1->Append(level2);
  level2->Append("[2 ");

  // Level 3 is complete before being appended.
  auto level3 = fxl::MakeRefCounted<AsyncOutputBuffer>();
  level3->Complete("[3]]");
  EXPECT_TRUE(level3->is_complete());

  EXPECT_FALSE(level2->is_complete());
  level2->Complete(level3);
  EXPECT_TRUE(level2->is_complete());

  EXPECT_FALSE(level1->is_complete());
  level1->Complete(OutputBuffer("]"));
  EXPECT_TRUE(level1->is_complete());

  auto flat = level1->DestructiveFlatten();
  EXPECT_EQ("[1 [2 [3]]]", flat.AsString());
}

TEST(AsyncOutputBuffer, Async) {
  auto level1 = fxl::MakeRefCounted<AsyncOutputBuffer>();

  bool level1_complete = false;
  level1->SetCompletionCallback([&level1, &level1_complete]() {
    EXPECT_TRUE(level1->is_complete());
    level1_complete = true;
  });

  level1->Append("[1 ");

  // Level 2 is appended before being marked complete.
  auto level2 = fxl::MakeRefCounted<AsyncOutputBuffer>();
  level1->Append(level2);
  level1->Complete(OutputBuffer("]"));
  level2->Append("[2 ");

  // Level 3 is complete before being appended.
  auto level3 = fxl::MakeRefCounted<AsyncOutputBuffer>();
  level3->Complete("[3]]");
  EXPECT_TRUE(level3->is_complete());

  // Level 1 callback should not have been issued yet.
  EXPECT_FALSE(level1_complete);

  EXPECT_FALSE(level2->is_complete());
  level2->Complete(level3);
  EXPECT_TRUE(level2->is_complete());

  // Level 1 callback should have been issued.
  EXPECT_TRUE(level1_complete);
  EXPECT_TRUE(level1->is_complete());

  auto flat = level1->DestructiveFlatten();
  EXPECT_EQ("[1 [2 [3]]]", flat.AsString());
}

}  // namespace zxdb
