# Path: ledgerbil/colorable.py
# class Colorable:
# 
#     START_CODE = "\033"
#     END_CODE = f"{START_CODE}[0m"
# 
#     BRIGHT_OFFSET = 60
# 
#     COLORS = {
#         "black": 30,
#         "gray": 30,
#         "grey": 30,
#         "red": 31,
#         "green": 32,
#         "yellow": 33,
#         "blue": 34,
#         "magenta": 35,
#         "purple": 35,
#         "cyan": 36,
#         "white": 37,
#     }
# 
#     ansi_escape = re.compile(r"\x1B\[[0-?]*[ -/]*[@-~]")
# 
#     def __init__(self, color, value, fmt="", bright=False):
# 
#         if color not in self.COLORS:
#             raise UnsupportedColorError(
#                 f"I don't know what to do with this color: {color}"
#             )
# 
#         self.my_color = color
#         self.value = value
#         self.bright = bright
#         self.format_string = fmt
# 
#     def __repr__(self):
#         return (
#             f"Colorable('{self.my_color}', '{self.value}', "
#             f"fmt='{self.format_string}', bright={self.bright})"
#         )
# 
#     def __str__(self):
#         start = self.ansi_sequence(self.COLORS[self.my_color], bright=self.bright)
#         ansi_str = f"{start}{self.value:{self.format_string}}{self.END_CODE}"
#         return ansi_str
# 
#     def __len__(self):
#         return len(self.value)
# 
#     def __eq__(self, other):
#         return str(self) == str(other)
# 
#     def ansi_sequence(self, code, bright=False):
#         offset = 60 if bright else 0
#         color = code + offset
#         return f"{self.START_CODE}[0;{color}m"
# 
#     def plain(self):
#         return self.value
# 
#     @staticmethod
#     def get_plain_string(ansi_string):
#         return Colorable.ansi_escape.sub("", ansi_string)
# 
# Path: ledgerbil/ledgerbilexceptions.py
# class LdgPortfolioError(LdgException):
#     pass
# 
# Path: ledgerbil/tests/helpers.py
# class OutputFileTester(OutputFileTesterBase):
#     def __init__(self, testfile):
#         super().__init__()
#         self.testfile = testfile
# 
#     def save_out_file(self, data):
#         with open(self.get_out_filename(self.testfile), "w", encoding="utf-8") as afile:
#             afile.write(self.remove_color(data))
# 
#     def assert_out_equals_expected(self):
#         assert filecmp.cmp(
#             self.get_out_filename(self.testfile),
#             self.get_expected_filename(self.testfile),
#         ), f"test filename out: {self.get_out_filename(self.testfile)}"


import json
import pytest
from unittest import mock
from .. import portfolio, settings, settings_getter
from ..colorable import Colorable
from ..ledgerbilexceptions import LdgPortfolioError
from .helpers import OutputFileTester
    helper.assert_out_equals_expected()


@mock.patch(__name__ + ".portfolio.get_portfolio_data")
def test_get_portfolio_report_compare_accounts(mock_get_data):
    mock_get_data.return_value = portfolio_data
    args = portfolio.get_args(["--accounts", "401k", "--compare"])
    report = portfolio.get_portfolio_report(args)
    helper = OutputFileTester("test_portfolio_report_compare_accounts")
    helper.save_out_file(report)
    helper.assert_out_equals_expected()


@mock.patch(__name__ + ".portfolio.get_portfolio_data")
def test_get_portfolio_report_compare_accounts_no_current_value(mock_get_data):
    mock_get_data.return_value = portfolio_data
    accounts = [portfolio_data[CLOSED]]
    labels = {"closed"}
    accounts_regex = ".*"
    included_years = {"2014", "2015"}
    sort = "v"
    accounts_only = False
    comparison_report = portfolio.get_comparison_report(
        accounts, labels, accounts_regex, included_years, sort, accounts_only
    )
    space = "              "
    expected = (
        f"labels{space}value    %     gain val  yr    all %    1yr %      \n"
        f"closed{space}                   $ 75   2     0.75     0.50      \n"
    )

# Path: ledgerbil/colorable.py
# class Colorable:
# 
#     START_CODE = "\033"
#     END_CODE = f"{START_CODE}[0m"
# 
#     BRIGHT_OFFSET = 60
# 
#     COLORS = {
#         "black": 30,
#         "gray": 30,
#         "grey": 30,
#         "red": 31,
#         "green": 32,
#         "yellow": 33,
#         "blue": 34,
#         "magenta": 35,
#         "purple": 35,
#         "cyan": 36,
#         "white": 37,
#     }
# 
#     ansi_escape = re.compile(r"\x1B\[[0-?]*[ -/]*[@-~]")
# 
#     def __init__(self, color, value, fmt="", bright=False):
# 
#         if color not in self.COLORS:
#             raise UnsupportedColorError(
#                 f"I don't know what to do with this color: {color}"
#             )
# 
#         self.my_color = color
#         self.value = value
#         self.bright = bright
#         self.format_string = fmt
# 
#     def __repr__(self):
#         return (
#             f"Colorable('{self.my_color}', '{self.value}', "
#             f"fmt='{self.format_string}', bright={self.bright})"
#         )
# 
#     def __str__(self):
#         start = self.ansi_sequence(self.COLORS[self.my_color], bright=self.bright)
#         ansi_str = f"{start}{self.value:{self.format_string}}{self.END_CODE}"
#         return ansi_str
# 
#     def __len__(self):
#         return len(self.value)
# 
#     def __eq__(self, other):
#         return str(self) == str(other)
# 
#     def ansi_sequence(self, code, bright=False):
#         offset = 60 if bright else 0
#         color = code + offset
#         return f"{self.START_CODE}[0;{color}m"
# 
#     def plain(self):
#         return self.value
# 
#     @staticmethod
#     def get_plain_string(ansi_string):
#         return Colorable.ansi_escape.sub("", ansi_string)
# 
# Path: ledgerbil/ledgerbilexceptions.py
# class LdgPortfolioError(LdgException):
#     pass
# 
# Path: ledgerbil/tests/helpers.py
# class OutputFileTester(OutputFileTesterBase):
#     def __init__(self, testfile):
#         super().__init__()
#         self.testfile = testfile
# 
#     def save_out_file(self, data):
#         with open(self.get_out_filename(self.testfile), "w", encoding="utf-8") as afile:
#             afile.write(self.remove_color(data))
# 
#     def assert_out_equals_expected(self):
#         assert filecmp.cmp(
#             self.get_out_filename(self.testfile),
#             self.get_expected_filename(self.testfile),
#         ), f"test filename out: {self.get_out_filename(self.testfile)}"


# Path: ledgerbil/tests/test_portfolio.py
import json
import pytest
from unittest import mock
from .. import portfolio, settings, settings_getter
from ..colorable import Colorable
from ..ledgerbilexceptions import LdgPortfolioError
from .helpers import OutputFileTester

    helper.assert_out_equals_expected()


@mock.patch(__name__ + ".portfolio.get_portfolio_data")
def test_get_portfolio_report_compare_accounts(mock_get_data):
    mock_get_data.return_value = portfolio_data
    args = portfolio.get_args(["--accounts", "401k", "--compare"])
    report = portfolio.get_portfolio_report(args)
    helper = OutputFileTester("test_portfolio_report_compare_accounts")
    helper.save_out_file(report)
    helper.assert_out_equals_expected()


@mock.patch(__name__ + ".portfolio.get_portfolio_data")
def test_get_portfolio_report_compare_accounts_no_current_value(mock_get_data):
    mock_get_data.return_value = portfolio_data
    accounts = [portfolio_data[CLOSED]]
    labels = {"closed"}
    accounts_regex = ".*"
    included_years = {"2014", "2015"}
    sort = "v"
    accounts_only = False
    comparison_report = portfolio.get_comparison_report(
        accounts, labels, accounts_regex, included_years, sort, accounts_only
    )
    space = "              "
    expected = (
        f"labels{space}value    %     gain val  yr    all %    1yr %      \n"
        f"closed{space}                   $ 75   2     0.75     0.50      \n"
    )

    assert Colorable.get_plain_string(comparison_report) == expected