# Copyright 2023 The Pigweed Authors
#
# 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
#
#     https://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.
"""Tests for pw_module.seed."""

from pathlib import Path
import tempfile
import unittest

from pw_module import seed


_SAMPLE_REGISTRY_FILE = '''
import("//build_overrides/pigweed.gni")

import("seed.gni")

pw_seed("0001") {
  sources = [ "0001.rst" ]
  inputs = [ "0001/seed-index-gerrit.png" ]
  title = "The SEED Process"
  status = "Meta"
  author = "The Pigweed Authors"
  facilitator = "N/A"
}

pw_seed("0002") {
  sources = [ "0002.rst" ]
  title = "SEED Template"
  status = "Meta"
  author = "The Pigweed Authors"
  facilitator = "N/A"
}

pw_seed_index("seeds") {
  index_file = "0000.rst"
  seeds = [
    ":0001",
    ":0002",
  ]
}
'''


_SAMPLE_REGISTRY_FILE_WITH_ADDED_SEED = '''
import("//build_overrides/pigweed.gni")

import("seed.gni")

pw_seed("0001") {
  sources = [ "0001.rst" ]
  inputs = [ "0001/seed-index-gerrit.png" ]
  title = "The SEED Process"
  status = "Meta"
  author = "The Pigweed Authors"
  facilitator = "N/A"
}

pw_seed("0002") {
  sources = [ "0002.rst" ]
  title = "SEED Template"
  status = "Meta"
  author = "The Pigweed Authors"
  facilitator = "N/A"
}

pw_seed("0200") {
  title = "a title"
  author = "an author"
  status = "Draft"
  changelist = 111111
}

pw_seed_index("seeds") {
  index_file = "0000.rst"
  seeds = [
    ":0001",
    ":0002",
    ":0200",
  ]
}
'''


class TestSeedMetadata(unittest.TestCase):
    """Tests for SeedMetadata."""

    def test_default_filename_basic(self):
        meta = seed.SeedMetadata(
            number=789,
            title='Simple Title 2',
            authors='',
            status=seed.SeedStatus.DRAFT,
        )
        self.assertEqual(meta.default_filename(), '0789.rst')

    def test_default_filename_special_characters(self):
        meta = seed.SeedMetadata(
            number=9876,
            title="pw_some_module: Pigweed's newest module",
            authors='',
            status=seed.SeedStatus.DRAFT,
        )
        self.assertEqual(
            meta.default_filename(),
            '9876.rst',
        )


class TestSeedRegistry(unittest.TestCase):
    """Tests for SEED registry modifications."""

    def setUp(self):
        self._dir = tempfile.TemporaryDirectory()
        root = Path(self._dir.name)
        self._build_file = root / 'seed' / 'BUILD.gn'
        self._build_file.parent.mkdir()
        self._build_file.write_text(_SAMPLE_REGISTRY_FILE)
        self._registry = seed.SeedRegistry.parse(self._build_file)

    def tearDown(self):
        self._dir.cleanup()

    def test_basic_parsing(self):
        self.assertEqual(self._registry.seed_count(), 2)

    def test_insert_seed(self):
        meta = seed.SeedMetadata(
            number=200,
            title='a title',
            authors='an author',
            status=seed.SeedStatus.DRAFT,
            changelist=111111,
        )
        self._registry.insert(meta)
        self._registry.write()

        self.assertEqual(
            self._build_file.read_text(),
            _SAMPLE_REGISTRY_FILE_WITH_ADDED_SEED,
        )


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