#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Tests for BaseProduct.
This module contains unit tests for the BaseProduct class and related functionality.
"""
import datetime
import os
import pytest
from pDESy.model.base_component import BaseComponent, BaseComponentState
from pDESy.model.base_product import BaseProduct
from pDESy.model.base_task import BaseTaskState
[docs]
def test_init():
"""Test initialization of BaseProduct."""
c1 = BaseComponent("c1")
product = BaseProduct(component_set={c1})
assert product.component_set == {c1}
[docs]
def test_initialize():
"""Test initialization/reset of BaseProduct."""
c1 = BaseComponent("c1")
product = BaseProduct(component_set={c1})
product.initialize()
[docs]
def test_create_component():
"""Test creating a component from a product."""
product = BaseProduct()
component = product.create_component("c1")
assert component in product.component_set
assert component.parent_product_id == product.ID
[docs]
def test_str():
"""Test string representation of BaseProduct."""
print(BaseProduct(component_set=set()))
[docs]
def test_plot_simple_gantt(tmpdir):
"""Test plotting a simple Gantt chart.
Args:
tmpdir: Temporary directory provided by pytest.
"""
c1 = BaseComponent("c1")
c2 = BaseComponent("c2")
product = BaseProduct(component_set={c1, c2})
# Set test case
c1.state_record_list = [
BaseTaskState.READY,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
BaseTaskState.WORKING,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
]
c2.state_record_list = [
BaseTaskState.WORKING,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
BaseTaskState.FINISHED,
]
for ext in ["png"]:
save_fig_path = os.path.join(str(tmpdir), "test." + ext)
product.plot_simple_gantt(
target_id_order_list=[c1.ID, c2.ID],
save_fig_path=save_fig_path,
)
[docs]
def test_create_data_for_gantt_plotly():
"""Test creating data for Gantt chart using Plotly."""
c1 = BaseComponent("c1")
c2 = BaseComponent("c2")
product = BaseProduct(component_set={c1, c2})
# Set test case
c1.state_record_list = [
BaseTaskState.READY,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
BaseTaskState.WORKING,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
]
c2.state_record_list = [
BaseTaskState.WORKING,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
BaseTaskState.FINISHED,
]
init_datetime = datetime.datetime(2020, 4, 1, 8, 0, 0)
timedelta = datetime.timedelta(days=1)
product.create_data_for_gantt_plotly(
init_datetime, timedelta, target_id_order_list=[c1.ID, c2.ID]
)
[docs]
def test_remove_insert_absence_time_list():
"""Test removing and inserting absence time list for BaseProduct."""
c1 = BaseComponent("c1", "----")
c1.placed_workplace_id_record_list = ["aa", "bb", "cc", "dd", "ee", "ff"]
c1.state_record_list = [0, 1, 2, 3, 4, 5]
c2 = BaseComponent("c2", "----")
c2.placed_workplace_id_record_list = ["ff", "ee", "dd", "cc", "bb", "aa"]
c2.state_record_list = [5, 4, 3, 2, 1, 0]
c2.add_child_component(c1)
product = BaseProduct(component_set={c1, c2})
absence_time_list = [0, 1]
product.remove_absence_time_list(absence_time_list)
assert c1.placed_workplace_id_record_list == ["cc", "dd", "ee", "ff"]
assert c1.state_record_list == [2, 3, 4, 5]
assert c2.placed_workplace_id_record_list == ["dd", "cc", "bb", "aa"]
assert c2.state_record_list == [3, 2, 1, 0]
product.insert_absence_time_list(absence_time_list)
assert c1.placed_workplace_id_record_list == [
None,
None,
"cc",
"dd",
"ee",
"ff",
]
assert c1.state_record_list == [
BaseComponentState.NONE,
BaseComponentState.READY,
2,
3,
4,
5,
]
assert c2.placed_workplace_id_record_list == [
None,
None,
"dd",
"cc",
"bb",
"aa",
]
assert c2.state_record_list == [
BaseComponentState.NONE,
BaseComponentState.NONE,
3,
2,
1,
0,
]
[docs]
def test_create_gantt_plotly(tmpdir):
"""Test creating a Gantt chart using Plotly.
Args:
tmpdir: Temporary directory provided by pytest.
"""
c1 = BaseComponent("c1")
c2 = BaseComponent("c2")
product = BaseProduct(component_set={c1, c2})
# Set test case
c1.state_record_list = [
BaseTaskState.READY,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
BaseTaskState.WORKING,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
]
c2.state_record_list = [
BaseTaskState.WORKING,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
BaseTaskState.WORKING,
BaseTaskState.FINISHED,
BaseTaskState.FINISHED,
]
init_datetime = datetime.datetime(2020, 4, 1, 8, 0, 0)
timedelta = datetime.timedelta(days=1)
for ext in ["png", "html", "json"]:
save_fig_path = os.path.join(str(tmpdir), "test." + ext)
product.create_gantt_plotly(
init_datetime,
timedelta,
target_id_order_list=[c1.ID, c2.ID],
save_fig_path=save_fig_path,
)
[docs]
def test_get_networkx_graph():
"""Test getting a NetworkX graph from BaseProduct."""
c1 = BaseComponent("c1")
c2 = BaseComponent("c2")
c3 = BaseComponent("c3")
c1.child_component_id_set = {c2.ID}
c2.child_component_id_set = {c3.ID}
product = BaseProduct(component_set={c3, c2, c1})
product.get_networkx_graph()
[docs]
def test_draw_networkx(tmpdir):
"""Test drawing a NetworkX graph.
Args:
tmpdir: Temporary directory provided by pytest.
"""
c1 = BaseComponent("c1")
c2 = BaseComponent("c2")
c3 = BaseComponent("c3")
c1.child_component_id_set = {c2.ID}
c2.child_component_id_set = {c3.ID}
product = BaseProduct(component_set={c3, c2, c1})
for ext in ["png"]:
save_fig_path = os.path.join(str(tmpdir), "test." + ext)
product.draw_networkx(save_fig_path=save_fig_path)
[docs]
def test_get_node_and_edge_trace_for_plotly_network():
"""Test getting node and edge traces for Plotly network."""
c1 = BaseComponent("c1")
c2 = BaseComponent("c2")
c3 = BaseComponent("c3")
c1.child_component_id_set = {c2.ID}
c2.child_component_id_set = {c3.ID}
product = BaseProduct(component_set={c3, c2, c1})
product.get_node_and_edge_trace_for_plotly_network()
[docs]
def test_draw_plotly_network(tmpdir):
"""Test drawing a Plotly network.
Args:
tmpdir: Temporary directory provided by pytest.
"""
c1 = BaseComponent("c1")
c2 = BaseComponent("c2")
c3 = BaseComponent("c3")
c1.child_component_id_set = {c2.ID}
c2.child_component_id_set = {c3.ID}
product = BaseProduct(component_set={c3, c2, c1})
for ext in ["png", "html", "json"]:
save_fig_path = os.path.join(str(tmpdir), "test." + ext)
product.draw_plotly_network(save_fig_path=save_fig_path)
[docs]
def test_print_mermaid_diagram(dummy_product_for_extracting):
"""Test printing Mermaid diagrams.
Args:
dummy_product_for_extracting (BaseProduct): The dummy product fixture.
"""
dummy_product_for_extracting.print_mermaid_diagram(
orientations="LR",
subgraph=True,
)
dummy_product_for_extracting.print_target_component_mermaid_diagram(
{
list(dummy_product_for_extracting.component_set)[0],
list(dummy_product_for_extracting.component_set)[1],
},
orientations="LR",
subgraph=False,
)