File size: 1,669 Bytes
03a907a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import pytest
from dataset.problem_23.buggy import optimize_portfolio

def test_optimize_portfolio():
    investments = [
        {'id': 'A', 'cost': 50, 'expected_return': 60}, # ratio 1.2
        {'id': 'B', 'cost': 30, 'expected_return': 45}, # ratio 1.5
        {'id': 'C', 'cost': 20, 'expected_return': 40}, # ratio 2.0
        {'id': 'D', 'cost': 40, 'expected_return': 50}, # ratio 1.25
        {'id': 'E', 'cost': 10, 'expected_return': 15}  # ratio 1.5
    ]
    
    # Original list should not be mutated
    orig_investments = [dict(i) for i in investments]
    
    # Budget 50
    # Expected greedy: C (20) -> B (30) -> total cost 50, return 85
    result = optimize_portfolio(investments, 50)
    
    assert investments == orig_investments, "Original list was mutated"
    
    # Assert correct items selected
    chosen_ids = {item['id'] for item in result}
    assert chosen_ids == {'B', 'C'}, f"Expected B and C, got {chosen_ids}"
    
    total_cost = sum(item['cost'] for item in result)
    assert total_cost <= 50
    
def test_budget_exceeded_check():
    investments = [
        {'id': 'A', 'cost': 90, 'expected_return': 100},
        {'id': 'B', 'cost': 50, 'expected_return': 60}
    ]
    
    # Budget 100
    # Expected: A (cost 90)
    result = optimize_portfolio(investments, 100)
    
    chosen_ids = {item['id'] for item in result}
    assert chosen_ids == {'A'}, "Should not include B since total cost would be 140"
    
def test_empty_or_zero_budget():
    assert optimize_portfolio([], 100) == []
    assert optimize_portfolio([{'id': 'A', 'cost': 10, 'expected_return': 20}], 0) == []