content: import unittest
  from contextlib import ExitStack
  from typing import Iterable
  
  from pyecharts.charts import Bar, Line, Page
  from pyecharts.commons.utils import OrderedSet
  from pyecharts.globals import ThemeType, CurrentConfig
  from pyecharts.components import Table
  from pyecharts import options as opts
  from pyecharts.faker import Faker
  
  
  def _create_bar() -> Bar:
      return (
          Bar(init_opts=opts.InitOpts(theme=ThemeType.ROMA))
          .add_xaxis(Faker.week)
          .add_yaxis("商家A", [1, 2, 3, 4, 5, 6, 7])
      )
  
  
  def _create_line() -> Line:
      return (
          Line(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
          .add_xaxis(Faker.week)
          .add_yaxis("商家A", [7, 6, 5, 4, 3, 2, 1])
      )
  
  
  def _create_table() -> Table:
      table = Table()
      headers = ["City name", "Area", "Population", "Annual Rainfall"]
      rows = [
          ["Brisbane", 5905, 1857594, 1146.4],
          ["Adelaide", 1295, 1158259, 600.5],
          ["Darwin", 112, 120900, 1714.7],
      ]
      table.add(headers, rows)
      return table
  
  
  class TestPageComponent(unittest.TestCase):
      def test_page_layout_default(self):
          page = Page()
          self.assertEqual(page.layout, "")
  
      def test_page_layout_custom(self):
          page = Page(layout=Page.SimplePageLayout)
          self.assertEqual(
              page.layout, "justify-content:center; display:flex; flex-wrap:wrap; "
          )
  
      def test_page_jshost_default(self):
          bar = _create_bar()
          line = _create_line()
          page = Page().add(bar, line)
          self.assertEqual(page.js_host, "https://assets.pyecharts.org/assets/v5/")
  
      def test_page_jshost_custom(self):
          from pyecharts.globals import CurrentConfig
  
          default_host = CurrentConfig.ONLINE_HOST
          custom_host = "http://localhost:8888/assets/"
          CurrentConfig.ONLINE_HOST = custom_host
          bar = _create_bar()
          line = _create_line()
          page = Page().add(bar, line)
          self.assertEqual(page.js_host, custom_host)
          CurrentConfig.ONLINE_HOST = default_host
  
      def test_page_render_embed(self):
          bar = _create_bar()
          line = _create_line()
          content = Page().add(bar, line).render_embed()
          self.assertTrue(len(content) > 8000)
  
      def test_page_render_notebook(self):
          page = Page()
          page.add(_create_line(), _create_bar(), _create_table())
          html = page.render_notebook().__html__()
          self.assertIn("City name", html)
  
      def test_page_load_javascript(self):
          bar = _create_bar()
          line = _create_line()
          content = Page().add(bar, line).load_javascript()
          self.assertEqual("", content.data)
          self.assertEqual(
              ["https://assets.pyecharts.org/assets/v5/echarts.min.js"], content.lib
          )
  
      def _get_new_page(self, unique: bool = True) -> Page:
          bar = _create_bar()
          line = _create_line()
  
          if not unique:
              bar.chart_id = "chenjiandongx_is_an_awesome_boy"
              line.chart_id = "chenjiandongx_is_an_amazing_boy"
  
          p = Page(layout=Page.DraggablePageLayout)
          p.add(bar, line)
          return p
  
      # chart_config.json content
      LAYOUT_DICT = [
          {
              "cid": "chenjiandongx_is_an_awesome_boy",
              "width": "900px",
              "height": "500px",
              "top": "31px",
              "left": "8px",
          },
          {
              "cid": "chenjiandongx_is_an_amazing_boy",
              "width": "900px",
              "height": "500px",
              "top": "30px",
              "left": "910px",
          },
      ]
  
      def test_page_draggable_layout_unique_chart_id(self):
          page1 = self._get_new_page()
          html1 = page1.save_resize_html(source=page1.render(), cfg_dict=self.LAYOUT_DICT)
  
          page2 = self._get_new_page()
          html2 = page2.save_resize_html(source=page2.render(), cfg_dict=self.LAYOUT_DICT)
  
          self.assertNotEqual(html1, html2)
  
      def test_page_draggable_layout_same_chart_id(self):
          page1 = self._get_new_page(unique=False)
          html1 = page1.save_resize_html(source=page1.render(), cfg_dict=self.LAYOUT_DICT)
  
          page2 = self._get_new_page(unique=False)
          html2 = page2.save_resize_html(source=page2.render(), cfg_dict=self.LAYOUT_DICT)
  
          self.assertEqual(html1, html2)
  
      def test_page_cfg_type(self):
          page = Page()
  
          with ExitStack() as stack:
              stack.enter_context(self.assertRaises(FileNotFoundError))
              stack.enter_context(self.assertRaises(ValueError))
              page.save_resize_html()
  
      def test_page_iterable(self):
          page = Page()
          self.assertTrue(isinstance(page, Iterable))
  
      def test_page_attr(self):
          page = Page()
          self.assertTrue(isinstance(page.js_functions, OrderedSet))
          self.assertTrue(isinstance(page._charts, list))
  
      def test_page_resize(self):
          page = Page()
          content = page.save_resize_html(
              cfg_dict=[
                  {"cid": "xxx", "width": 100, "height": 100, "top": 100, "left": 100}
              ]
          )
          self.assertNotIn(".resizable()", content)
          self.assertNotIn(".draggable()", content)
  
      def test_page_resize_cfg(self):
          page = Page()
          content = page.save_resize_html(cfg_file="test/fixtures/resize_cfg.json")
          self.assertNotIn(".resizable()", content)
          self.assertNotIn(".draggable()", content)
  
      def test_page_no_cfg_dict_or_file(self):
          with self.assertRaises(ValueError):
              page = Page()
              page.save_resize_html()
  
      def test_page_with_is_embed_js(self):
          page = Page(layout=Page.SimplePageLayout, is_embed_js=True)
          # Embedded JavaScript
          content = page.render_embed()
          self.assertNotIn(
              CurrentConfig.ONLINE_HOST, content, "Embedding JavaScript fails"
          )
  