#!/usr/bin/env python3
# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import sys
import unittest
import infobar_deprecation

sys.path.append(
  os.path.dirname(
    os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  )
)
from PRESUBMIT_test_mocks import MockFile, MockInputApi, MockOutputApi

_MOCK_INFOBAR_DELEGATE_H_CONTENTS = '''
// random comments
enum InfoBarIdentifier {
  A_INFOBAR_ANDROID = 1,
  B_INFOBAR_MOBILE = 2,
  // OBSOLETE_INFOBAR_ANDROID obsolete infobar,
  C_INFOBAR_IOS = 3,
  D_INFOBAR = 4,
  E_INFOBAR = 5,
  F_INFOBAR_ANDROID = 6,
  F_INFOBAR_MOBILE = 7,
  F_INFOBAR_IOS = 8,
  // G_INFOBAR_ANDROID = 9,
};
// random comments

'''


class InfobarDeprecationMockInputApi(MockInputApi):
  def ReadFile(self, filename, mode='rU'):
    return _MOCK_INFOBAR_DELEGATE_H_CONTENTS


class InfobarDeprecationMockInputFile(MockFile):
  def ChangedContents(self):
    return [
      (6, '  E_INFOBAR = 5,'),
      (7, '  F_INFOBAR_ANDROID = 6,'),
      (8, '  F_INFOBAR_MOBILE = 7,'),
      (9, '  F_INFOBAR_IOS = 8,'),
      (10, '  // G_INFOBAR_ANDROID = 9,'),
    ]


class TestInfobarDeprecation(unittest.TestCase):
  def testInfoBarIdentifier(self):
    lines = []

    mock_input_api = MockInputApi()
    mock_input_api.files = [
      MockFile(
        os.path.join(
          infobar_deprecation.INFOBAR_ANDROID_FOLDERS[0],
          'TestInfobarDelegate.java',
        ),
        lines,
      ),
      MockFile(
        os.path.join(
          infobar_deprecation.INFOBAR_ANDROID_FOLDERS[1],
          'test_infobar_delegate.cc',
        ),
        lines,
      ),
      # Add un-related file for testing.
      MockFile(
        os.path.join(
          infobar_deprecation.INFOBAR_ANDROID_FOLDERS[1], 'README.md'
        ),
        lines,
      ),
    ]
    warnings = infobar_deprecation._CheckNewInfobar(
      mock_input_api, MockOutputApi()
    )
    self.assertEqual(1, len(warnings))
    self.assertEqual(2, len(warnings[0].items))

  def testInfobarFiles(self):
    mock_input_api = InfobarDeprecationMockInputApi()
    mock_input_api.files = [
      InfobarDeprecationMockInputFile(
        infobar_deprecation.INFOBAR_DELEGATE_H, []
      ),
    ]
    warnings = infobar_deprecation._CheckNewInfobar(
      mock_input_api, MockOutputApi()
    )
    self.assertEqual(1, len(warnings))
    self.assertEqual(2, len(warnings[0].items))


if __name__ == '__main__':
  unittest.main()
