ManifoldMarketManager/ManifoldMarketManager/test/rule/manifold/test_this.py

78 lines
3.3 KiB
Python

from __future__ import annotations
from typing import TYPE_CHECKING
from urllib.parse import quote
from pytest import mark, raises, skip
from ....account import Account
from ....consts import AnyResolution, Outcome
from ....market import Market
from ....rule.manifold.this import (CurrentValueRule, FibonacciValueRule, PopularValueRule, RoundValueRule,
ThisMarketClosed, UniqueTradersRule)
from ... import manifold_vcr, mkt
assert mkt # just need to access it so mypy doesn't complain
if TYPE_CHECKING: # pragma: no cover
from pytest_regressions.data_regression import DataRegressionFixture
from ....consts import FreeResponseResolution
def test_CurentValueRule(mkt: Market, data_regression: DataRegressionFixture) -> None:
with manifold_vcr.use_cassette(f'rule/manifold/this/test_CurrentValueRule/{quote(mkt.market.id)}.yaml'):
obj: CurrentValueRule[AnyResolution] = CurrentValueRule()
val = obj.value(mkt, Account.from_env())
data_regression.check({'answer': val})
@mark.depends(on=(
'ManifoldMarketManager/test/test_util.py::test_fib',
'ManifoldMarketManager/test/test_util.py::test_market_to_answer_map'
))
def test_FibonacciValueRule(mkt: Market, data_regression: DataRegressionFixture) -> None:
if mkt.market.outcomeType in Outcome.MC_LIKE():
with manifold_vcr.use_cassette(f'rule/manifold/this/test_FibonacciValueRule/{quote(mkt.market.id)}.yaml'):
obj = FibonacciValueRule()
val = obj.value(mkt, Account.from_env())
data_regression.check({'answer': val})
else:
with raises(RuntimeError):
FibonacciValueRule().value(mkt, Account.from_env())
def test_PopularValueRule(mkt: Market, data_regression: DataRegressionFixture) -> None:
with manifold_vcr.use_cassette(f'rule/manifold/this/test_PopularValueRule/{quote(mkt.market.id)}.yaml'):
if mkt.market.outcomeType in Outcome.MC_LIKE():
answer_to_check: list[FreeResponseResolution] = []
answer_to_check.append({}) # type: ignore
while True:
obj = PopularValueRule(size=len(answer_to_check))
val = obj._value(mkt, Account.from_env())
if val == answer_to_check[-1]:
break
answer_to_check.append(val)
data_regression.check({'answers': answer_to_check})
else:
with raises(RuntimeError):
PopularValueRule(size=1).value(mkt, Account.from_env())
@mark.depends(on=('test_CurentValueRule', ))
def test_RoundValueRule(mkt: Market, data_regression: DataRegressionFixture) -> None:
if mkt.market.outcomeType in Outcome.BINARY_LIKE():
with manifold_vcr.use_cassette(f'rule/manifold/this/test_RoundValueRule/{quote(mkt.market.id)}.yaml'):
obj = RoundValueRule()
val = obj.value(mkt, Account.from_env())
data_regression.check({'answer': val})
else:
skip("Rule does not support this market type")
def test_ThisMarketClosed(mkt: Market, data_regression: DataRegressionFixture) -> None:
with manifold_vcr.use_cassette(f'rule/manifold/this/test_ThisMarketClosed/{quote(mkt.market.id)}.yaml'):
obj = ThisMarketClosed()
val = obj.value(mkt, Account.from_env())
data_regression.check({'answer': val})