# Copyright (C) 2019 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Unittests for the editor.py module."""

import unittest

from editor import Editor


class EditorTestCase(unittest.TestCase):
  """Take care of resetting Editor state across tests."""

  def setUp(self):
    self.setEditor(None)

  def tearDown(self):
    self.setEditor(None)

  @staticmethod
  def setEditor(editor):
    Editor._editor = editor


class GetEditor(EditorTestCase):
  """Check GetEditor behavior."""

  def test_basic(self):
    """Basic checking of _GetEditor."""
    self.setEditor(':')
    self.assertEqual(':', Editor._GetEditor())


class EditString(EditorTestCase):
  """Check EditString behavior."""

  def test_no_editor(self):
    """Check behavior when no editor is available."""
    self.setEditor(':')
    self.assertEqual('foo', Editor.EditString('foo'))

  def test_cat_editor(self):
    """Check behavior when editor is `cat`."""
    self.setEditor('cat')
    self.assertEqual('foo', Editor.EditString('foo'))
