# Copyright 2024 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Generated by //build/rust/tests/create_rustdoc_tests.py
# Test explanation: checks that we can build a proc macro that use another crate, with a separate out dir

import unittest  # noqa
from sys import argv
from unittest import TestCase
from zipfile import Path

_doc_zip = argv.pop()


class Test(TestCase):
    _path: Path

    @classmethod
    def setUpClass(cls) -> None:
        cls._path = Path(_doc_zip)

    def testFileExists3(self) -> None:
        self.assertFalse(
            (self._path / "charlie/constant.CHARLIE.html").is_file(),
            msg=f"expected `charlie/constant.CHARLIE.html` to not be a file in {repr(self._path)}",
        )

    def testFileExists6(self) -> None:
        self.assertFalse(
            (self._path / "march/macro.make_constant.html").is_file(),
            msg=f"expected `march/macro.make_constant.html` to not be a file in {repr(self._path)}",
        )

    def testFileExists9(self) -> None:
        self.assertFalse(
            (self._path / "november/constant.NOVEMBER.html").is_file(),
            msg=f"expected `november/constant.NOVEMBER.html` to not be a file in {repr(self._path)}",
        )
