// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "platform/assert.h"
#include "vm/report.h"
#include "vm/unit_test.h"

namespace dart {

TEST_CASE(TraceJSWarning) {
  Isolate* isolate = Isolate::Current();
  TraceBuffer::Init(isolate, 3);
  TraceBuffer* trace_buffer = isolate->trace_buffer();
  const String& url = String::Handle(isolate, String::New("Plug"));
  const String& source = String::Handle(isolate, String::New("240 100"));
  const Script& script = Script::Handle(isolate,
      Script::New(url, source, RawScript::kScriptTag));
  script.Tokenize(String::Handle(String::New("")));
  {
    const intptr_t token_pos = 0;
    const char* message = "High Voltage";
    Report::MessageF(Report::kJSWarning, script, token_pos, "%s", message);
    {
      JSONStream js;
      trace_buffer->PrintToJSONStream(&js);
      EXPECT_SUBSTRING("{\"type\":\"TraceBuffer\",\"members\":["
                       "{\"type\":\"TraceBufferEntry\",\"time\":",
                       js.ToCString());
      // Skip time.
      EXPECT_SUBSTRING("\"message\":{\"type\":\"JSCompatibilityWarning\","
                       "\"script\":{\"type\":\"@Script\",\"id\":"
                       "\"libraries\\/-1\\/scripts\\/Plug\","
                       "\"name\":\"Plug\",\"user_name\":"
                       "\"Plug\",\"kind\":\"script\"},\"tokenPos\":0,"
                       "\"message\":{\"type\":\"@String\"",
                       js.ToCString());
      // Skip private _OneByteString.
      EXPECT_SUBSTRING("\"valueAsString\":\"\\\"High Voltage\\\"\"}}",
                       js.ToCString());
    }
  }
  {
    const intptr_t token_pos = 1;
    const char* message = "Low Voltage";
    Report::MessageF(Report::kJSWarning, script, token_pos, "%s", message);
  }
  EXPECT_EQ(2, trace_buffer->Length());
  EXPECT_SUBSTRING("{\"type\":\"JSCompatibilityWarning\",\"script\":{\"type\":"
                   "\"@Script\",\"id\":\"libraries\\/-1\\/scripts\\/Plug\","
                   "\"name\":\"Plug\","
                   "\"user_name\":\"Plug\",\"kind\":\"script\"},\"tokenPos\":0,"
                   "\"message\":{\"type\":\"@String\"",
                   trace_buffer->At(0)->message);
  // Skip private _OneByteString.
  EXPECT_SUBSTRING("\"valueAsString\":\"\\\"High Voltage\\\"\"}}",
                   trace_buffer->At(0)->message);

  EXPECT_SUBSTRING("{\"type\":\"JSCompatibilityWarning\",\"script\":{\"type\":"
                   "\"@Script\",\"id\":\"libraries\\/-1\\/scripts\\/Plug\","
                   "\"name\":\"Plug\","
                   "\"user_name\":\"Plug\",\"kind\":\"script\"},\"tokenPos\":1,"
                   "\"message\":{\"type\":\"@String\"",
                   trace_buffer->At(1)->message);
  // Skip private _OneByteString.
  EXPECT_SUBSTRING("\"valueAsString\":\"\\\"Low Voltage\\\"\"}}",
                   trace_buffer->At(1)->message);

  delete trace_buffer;
}

}  // namespace dart

