// Copyright 2013 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 "media/midi/message_util.h"

#include <stdint.h>

#include "base/stl_util.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace midi {
namespace {

const uint8_t kGMOn[] = {0xf0, 0x7e, 0x7f, 0x09, 0x01, 0xf7};
const uint8_t kGSOn[] = {
    0xf0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7f, 0x00, 0x41, 0xf7,
};
const uint8_t kNoteOn[] = {0x90, 0x3c, 0x7f};
const uint8_t kNoteOnWithRunningStatus[] = {
    0x90, 0x3c, 0x7f, 0x3c, 0x7f, 0x3c, 0x7f,
};
const uint8_t kNoteOnWithRealTimeClock[] = {
    0x90, 0xf8, 0x3c, 0x7f, 0x90, 0xf8, 0x3c, 0xf8, 0x7f, 0xf8,
};
const uint8_t kGMOnWithRealTimeClock[] = {
    0xf0, 0xf8, 0x7e, 0x7f, 0x09, 0x01, 0xf8, 0xf7,
};
const uint8_t kSystemCommonMessageReserved1[] = {0xf4};
const uint8_t kSystemCommonMessageReserved2[] = {0xf5};
const uint8_t kSystemCommonMessageTuneRequest[] = {0xf6};
const uint8_t kChannelPressure[] = {0xd0, 0x01};
const uint8_t kChannelPressureWithRunningStatus[] = {0xd0, 0x01, 0x01, 0x01};
const uint8_t kTimingClock[] = {0xf8};
const uint8_t kBrokenData1[] = {0x90};
const uint8_t kBrokenData2[] = {0xf7};
const uint8_t kBrokenData3[] = {0xf2, 0x00};
const uint8_t kDataByte0[] = {0x00};

template <typename T, size_t N>
const std::vector<T> AsVector(const T (&data)[N]) {
  std::vector<T> buffer;
  buffer.insert(buffer.end(), data, data + N);
  return buffer;
}

template <typename T, size_t N>
void PushToVector(const T (&data)[N], std::vector<T>* buffer) {
  buffer->insert(buffer->end(), data, data + N);
}

TEST(MidiMessageUtilTest, GetMessageLength) {
  // Check basic functionarity
  EXPECT_EQ(base::size(kNoteOn), GetMessageLength(kNoteOn[0]));
  EXPECT_EQ(base::size(kChannelPressure),
            GetMessageLength(kChannelPressure[0]));
  EXPECT_EQ(base::size(kTimingClock), GetMessageLength(kTimingClock[0]));
  EXPECT_EQ(base::size(kSystemCommonMessageTuneRequest),
            GetMessageLength(kSystemCommonMessageTuneRequest[0]));

  // SysEx message should be mapped to 0-length
  EXPECT_EQ(0u, GetMessageLength(kGMOn[0]));

  // Any reserved message should be mapped to 0-length
  EXPECT_EQ(0u, GetMessageLength(kSystemCommonMessageReserved1[0]));
  EXPECT_EQ(0u, GetMessageLength(kSystemCommonMessageReserved2[0]));

  // Any data byte should be mapped to 0-length
  EXPECT_EQ(0u, GetMessageLength(kGMOn[1]));
  EXPECT_EQ(0u, GetMessageLength(kNoteOn[1]));
  EXPECT_EQ(0u, GetMessageLength(kChannelPressure[1]));
}

TEST(MidiMessageUtilTest, IsValidWebMIDIData) {
  // Test single event scenario
  EXPECT_TRUE(IsValidWebMIDIData(AsVector(kGMOn)));
  EXPECT_TRUE(IsValidWebMIDIData(AsVector(kGSOn)));
  EXPECT_TRUE(IsValidWebMIDIData(AsVector(kNoteOn)));
  EXPECT_TRUE(IsValidWebMIDIData(AsVector(kChannelPressure)));
  EXPECT_TRUE(IsValidWebMIDIData(AsVector(kTimingClock)));
  EXPECT_FALSE(IsValidWebMIDIData(AsVector(kBrokenData1)));
  EXPECT_FALSE(IsValidWebMIDIData(AsVector(kBrokenData2)));
  EXPECT_FALSE(IsValidWebMIDIData(AsVector(kBrokenData3)));
  EXPECT_FALSE(IsValidWebMIDIData(AsVector(kDataByte0)));

  // MIDI running status should be disallowed
  EXPECT_FALSE(IsValidWebMIDIData(AsVector(kNoteOnWithRunningStatus)));
  EXPECT_FALSE(IsValidWebMIDIData(AsVector(kChannelPressureWithRunningStatus)));

  // Multiple messages are allowed as long as each of them is complete.
  {
    std::vector<uint8_t> buffer;
    PushToVector(kGMOn, &buffer);
    PushToVector(kNoteOn, &buffer);
    PushToVector(kGSOn, &buffer);
    PushToVector(kTimingClock, &buffer);
    PushToVector(kNoteOn, &buffer);
    EXPECT_TRUE(IsValidWebMIDIData(buffer));
    PushToVector(kBrokenData1, &buffer);
    EXPECT_FALSE(IsValidWebMIDIData(buffer));
  }

  // MIDI realtime message can be placed at any position.
  EXPECT_TRUE(IsValidWebMIDIData(AsVector(kNoteOnWithRealTimeClock)));
  EXPECT_TRUE(IsValidWebMIDIData(AsVector(kGMOnWithRealTimeClock)));
}

}  // namespace
}  // namespace midi
