
    LiW#                     >   d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
mZ ddlZej                  j                  d e ee      j"                  j"                  j"                               ddlmZmZmZmZ  G d d      Z G d d	      Z G d
 d      Z G d d      Zy)u*   utils/usage_pricing.py 테스트 스위트    N)Decimal)Path)
CostResultPricingEntrycalculate_costformat_costc                   (    e Zd ZdZddZddZddZy)TestPricingEntryu    PricingEntry dataclass 테스트Nc                    t        t        d      t        d      t        d            }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}y)u   기본 필드 생성 확인3.0015.00z0.30)input_per_1moutput_per_1mcache_read_per_1m==)zR%(py2)s
{%(py2)s = %(py0)s.input_per_1m
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}entryr   py0py2py4py6py8assert %(py10)spy10N)zS%(py2)s
{%(py2)s = %(py0)s.output_per_1m
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
})zW%(py2)s
{%(py2)s = %(py0)s.cache_read_per_1m
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
})r   r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r   )selfr   @py_assert1@py_assert5@py_assert7@py_assert3@py_format9@py_format11s           5/home/jay/workspace/utils/tests/test_usage_pricing.pytest_pricing_entry_basic_fieldsz0TestPricingEntry.test_pricing_entry_basic_fields   s    !'*%fo

 !!4V4WV_4!_4444!_444444u444u444!444444W444W444V444_4444444""6g6gg&66"&66666"&6666666u666u666"666666g666g666g666&66666666&&9&9'&/9&/9999&/999999u999u999&999999'999'999&999/9999999    c                    t        t        d      t        d            }|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}y)u&   cache_read_per_1m 없이 생성 가능0.140.28r   r   N)is)z9%(py2)s
{%(py2)s = %(py0)s.cache_read_per_1m
} is %(py5)sr   )r   r   py5zassert %(py7)spy7)r   r   r   r   r   r   r   r    r!   r"   r#   )r$   r   r%   @py_assert4r(   @py_format6@py_format8s          r+   !test_pricing_entry_optional_cachez2TestPricingEntry.test_pricing_entry_optional_cache"   s     !&/
 &&.$.&$....&$......u...u...&...$.......r-   c                     t        t        d      t        d            }t        j                  t        t
        f      5  t        d      |_        ddd       y# 1 sw Y   yxY w)u    frozen dataclass - 수정 불가z1.00z2.00r1   z99.00N)r   r   pytestraisesAttributeError	TypeErrorr   )r$   r   s     r+   test_pricing_entry_frozenz*TestPricingEntry.test_pricing_entry_frozen*   sO     !&/
 ]]NI67 	2!(!1E	2 	2 	2s   AA"returnN)__name__
__module____qualname____doc__r,   r8   r>    r-   r+   r
   r
      s    *	:/2r-   r
   c                        e Zd ZdZddZddZy)TestCostResultu   CostResult dataclass 테스트Nc                    t        t        d      t        d      t        d      t        d            }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}x}}y)u   CostResult 필드 구조 확인z0.003z0.0150.0z0.018
input_costoutput_costcache_savings
total_costr   zP%(py2)s
{%(py2)s = %(py0)s.input_cost
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}resultr   r   r   r   NzQ%(py2)s
{%(py2)s = %(py0)s.output_cost
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}zP%(py2)s
{%(py2)s = %(py0)s.total_cost
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
})r   r   rK   r   r   r   r   r    r!   r"   r#   rL   rN   r$   rP   r%   r&   r'   r(   r)   r*   s           r+   test_cost_result_fieldsz&TestCostResult.test_cost_result_fields7   s(   w'(!%.w'	
   4G4GG$44 $44444 $4444444v444v444 444444G444G444G444$44444444!!5W5WW%55!%55555!%5555555v555v555!555555W555W555W555%55555555  4G4GG$44 $44444 $4444444v444v444 444444G444G444G444$44444444r-   c           	      f   t        t        d      t        d      t        d      t        d            }|j                  }|j                  }|j                  }||z   }||k(  }|sCt        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}x}}y)z%total_cost = input_cost + output_costz0.005z0.020rI   z0.025rJ   r   )z%(py2)s
{%(py2)s = %(py0)s.total_cost
} == (%(py6)s
{%(py6)s = %(py4)s.input_cost
} + %(py9)s
{%(py9)s = %(py7)s.output_cost
})rP   )r   r   r   r   r4   py9zassert %(py12)spy12N)r   r   rN   rK   rL   r   r   r   r   r    r!   r"   r#   )	r$   rP   r%   r&   @py_assert8@py_assert10r(   r*   @py_format13s	            r+   !test_cost_result_total_equals_sumz0TestCostResult.test_cost_result_total_equals_sumC   s   w'(!%.w'	
   JF$5$5J8J8JJ$58J$JJ $JJJJJ $JJJJJJJvJJJvJJJ JJJJJJFJJJFJJJ$5JJJJJJJJJJJJ8JJJJJJJJJr-   r?   )rA   rB   rC   rD   rT   r[   rE   r-   r+   rG   rG   4   s    (
5Kr-   rG   c                   x    e Zd ZdZddZddZddZddZddZddZ	dd	Z
dd
ZddZddZddZddZddZy)TestCalculateCostu   calculate_cost() 테스트Nc                 R   t        ddd      }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}y)u&   Claude Sonnet 4.6 기본 비용 계산claude-sonnet-4-6@B modelinput_tokensoutput_tokensr   r   rO   rP   r   r   r   r   Nr   rQ   18.00rR   r   rK   r   r   r   r   r   r    r!   r"   r#   rL   rN   rS   s           r+   test_claude_sonnet_basicz*TestCalculateCost.test_claude_sonnet_basicQ   s   %"#
   3F3GFO3 O3333 O333333v333v333 333333G333G333F333O3333333!!5W5WW%55!%55555!%5555555v555v555!555555W555W555W555%55555555  4G4GG$44 $44444 $4444444v444v444 444444G444G444G444$44444444r-   c                    t        ddd      }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}y)u   Claude Opus 4.6 비용 계산zclaude-opus-4-6r`   ra   r   r   rO   rP   r   r   r   r   Nz75.00rQ   r   rK   r   r   r   r   r   r    r!   r"   r#   rL   rS   s           r+   test_claude_opus_basicz(TestCalculateCost.test_claude_opus_basic]   si   #"#
   4G4GG$44 $44444 $4444444v444v444 444444G444G444G444$44444444!!5W5WW%55!%55555!%5555555v555v555!555555W555W555W555%55555555r-   c                    t        ddd      }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}y)u   Claude Haiku 비용 계산zclaude-3-5-haiku-20241022r`   ra   z0.80r   rO   rP   r   r   r   r   Nz4.00rQ   ri   rS   s           r+   test_claude_haiku_basicz)TestCalculateCost.test_claude_haiku_basich   sa   -"#

   3F3GFO3 O3333 O333333v333v333 333333G333G333F333O3333333!!4V4WV_4!_4444!_444444v444v444!444444W444W444V444_4444444r-   c                    t        ddd      }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}y)u   GPT-4o 기본 비용 계산zgpt-4or`   ra   z2.50r   rO   rP   r   r   r   r   N10.00rQ   ri   rS   s           r+   test_gpt4o_basicz"TestCalculateCost.test_gpt4o_basicr   se   "#

   3F3GFO3 O3333 O333333v333v333 333333G333G333F333O3333333!!5W5WW%55!%55555!%5555555v555v555!555555W555W555W555%55555555r-   c                    t        ddd      }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}y)u   GPT-4o-mini 비용 계산gpt-4o-minir`   ra   0.15r   rO   rP   r   r   r   r   N0.60rQ   ri   rS   s           r+   test_gpt4o_mini_basicz'TestCalculateCost.test_gpt4o_mini_basic|   sa   "#

   3F3GFO3 O3333 O333333v333v333 333333G333G333F333O3333333!!4V4WV_4!_4444!_444444v444v444!444444W444W444V444_4444444r-   c                    t        ddd      }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}y)u   Gemini Pro 비용 계산zgemini-2.5-pror`   ra   z1.25r   rO   rP   r   r   r   r   Nrn   rQ   ri   rS   s           r+   test_gemini_pro_basicz'TestCalculateCost.test_gemini_pro_basic   se   ""#

   3F3GFO3 O3333 O333333v333v333 333333G333G333F333O3333333!!5W5WW%55!%55555!%5555555v555v555!555555W555W555W555%55555555r-   c                    t        ddd      }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}y)u   Gemini Flash 비용 계산zgemini-2.5-flashr`   ra   rr   r   rO   rP   r   r   r   r   Nrs   rQ   ri   rS   s           r+   test_gemini_flash_basicz)TestCalculateCost.test_gemini_flash_basic   sa   $"#

   3F3GFO3 O3333 O333333v333v333 333333G333G333F333O3333333!!4V4WV_4!_4444!_444444v444v444!444444W444W444V444_4444444r-   c                    t        ddd      }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}y)u)   DeepSeek v3 (deepseek-chat) 비용 계산zdeepseek-chatr`   ra   r/   r   rO   rP   r   r   r   r   Nr0   rQ   ri   rS   s           r+   test_deepseek_v3_basicz(TestCalculateCost.test_deepseek_v3_basic   sa   !"#

   3F3GFO3 O3333 O333333v333v333 333333G333G333F333O3333333!!4V4WV_4!_4444!_444444v444v444!444444W444W444V444_4444444r-   c                    t        dddd      }|j                  }d}t        |      }||kD  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}x}}y)uB   캐시 읽기 절약 계산 - 캐시는 일반 입력보다 저렴r_   r   r`   rb   rc   rd   cache_read_tokens0>)zR%(py2)s
{%(py2)s = %(py0)s.cache_savings
} > %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}rP   r   r   r   r   N)r   rM   r   r   r   r   r   r    r!   r"   r#   rS   s           r+   test_cache_read_savingsz)TestCalculateCost.test_cache_read_savings   s    %'	
 ##2c2gcl2#l2222#l222222v222v222#222222g222g222c222l2222222r-   c                    t        ddd      }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}}y)u   토큰 0개면 비용 0r_   r   ra   r~   r   rR   rP   r   r   r   r   N)r   rN   r   r   r   r   r   r    r!   r"   r#   rS   s           r+   test_zero_tokensz"TestCalculateCost.test_zero_tokens   s    %

   0C0GCL0 L0000 L000000v000v000 000000G000G000C000L0000000r-   c                 |    t        j                  t              5  t        ddd       ddd       y# 1 sw Y   yxY w)u!   알 수 없는 모델은 KeyErrorzunknown-model-xyzd   ra   N)r:   r;   KeyErrorr   )r$   s    r+   test_unknown_model_raisesz+TestCalculateCost.test_unknown_model_raises   s4    ]]8$ 	) !	 	 	s   2;c                 R   t        ddd      }|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }d}t        |      }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}x}}y)u!   소량 토큰도 정확히 계산rq   i  i  ra   0.00015r   rO   rP   r   r   r   r   N0.00030rQ   0.00045rR   rf   rS   s           r+   test_small_token_countz(TestCalculateCost.test_small_token_count   s   
   6I6GI$66 $66666 $6666666v666v666 666666G666G666I666$66666666!!7Y7WY%77!%77777!%7777777v777v777!777777W777W777Y777%77777777  6I6GI$66 $66666 $6666666v666v666 666666G666G666I666$66666666r-   c                 J   t        dddd      }t        d      t        d      z   t        d      z   }|j                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y)u"   total_cost에 캐시 비용 포함r_   i  r|   z1.50z7.50rr   r   )z2%(py2)s
{%(py2)s = %(py0)s.total_cost
} == %(py4)srP   expected_total)r   r   r   zassert %(py6)sr   N)r   r   rN   r   r   r   r   r    r!   r"   r#   )r$   rP   r   r%   r(   @py_format5@py_format7s          r+   test_total_includes_cache_costz0TestCalculateCost.test_total_includes_cache_cost   s    % !%	
 !76?:WV_L  2 N2222 N222222v222v222 222222N222N2222222r-   r?   )rA   rB   rC   rD   rg   rj   rl   ro   rt   rv   rx   rz   r   r   r   r   r   rE   r-   r+   r]   r]   N   sF    $
5	6565655
3173r-   r]   c                   0    e Zd ZdZddZddZddZddZy)TestFormatCostu   format_cost() 테스트Nc                    t        t        d      t        d      t        d      t        d            }t        |      }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndd	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }t        t        j                  |            d}t        |      }d}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y)u0   소액 포맷 - $0.001 미만은 sub-cent 표시r   r   r~   r   rJ   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstance	formattedstrr   py1r   r   Nr   r   )z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slen)r   r   py3r   zassert %(py8)sr   )r   r   r   r   r   r   r   r   r    r!   r"   r#   r   r   )
r$   rP   r   r(   r   @py_assert2r&   r5   r   r)   s
             r+   test_format_small_costz%TestFormatCost.test_format_small_cost   sK   y)	*!#,y)	
  '	)S))))))))z)))z)))))))))))))))))S)))S))))))))))9~!!~!!!!~!!!!!!s!!!s!!!!!!9!!!9!!!~!!!!!!!!!!r-   c                    t        t        d      t        d      t        d      t        d            }t        |      }d}||v }|st        j                  d|fd||f      t        j
                  |      d	t        j                         v st        j                  |      rt        j
                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j
                  |      d	t        j                         v st        j                  |      rt        j
                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u   달러 단위 포맷r   r   r~   re   rJ   $)in)z%(py1)s in %(py3)sr   )r   r   zassert %(py5)sr3   N18)r   r   r   r   r   r!   r   r   r    r"   r#   )r$   rP   r   @py_assert0r   @py_format4r6   s          r+   test_format_dollar_costz&TestFormatCost.test_format_dollar_cost   s    v(!#,w'	
  '	sisisii ty    ty   t      y   y       r-   c                    t        t        d      t        d      t        d      t        d            }t        |      }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)	u   비용 0 포맷r~   rJ   r   r   r   r   r   Nr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   rP   r   r(   r   s        r+   test_format_zero_costz$TestFormatCost.test_format_zero_cost   s    s|!#,s|	
  '	)S))))))))z)))z)))))))))))))))))S)))S))))))))))r-   c                    t        t        d      t        d      t        d      t        d            }t        |      }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndd	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }t        t        j                  |            d}y)u&   캐시 절약 있을 때 표시 포함rr   z0.75z2.70z0.90rJ   r   r   r   r   r   Nr   r   s        r+   test_format_with_savingsz'TestFormatCost.test_format_with_savings  s    v!&/v	
  '	)S))))))))z)))z)))))))))))))))))S)))S))))))))))r-   r?   )rA   rB   rC   rD   r   r   r   r   rE   r-   r+   r   r      s    !
"
!	*	*r-   r   )rD   builtinsr   _pytest.assertion.rewrite	assertionrewriter   sysdecimalr   pathlibr   r:   pathinsertr   __file__parentutils.usage_pricingr   r   r   r   r
   rG   r]   r   rE   r-   r+   <module>r      s}    0   
    3tH~,,33::; < 2 2@K K4M3 M3`/* /*r-   