Spaces:
Sleeping
Sleeping
File size: 4,472 Bytes
cb922bf | 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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | """
Property-based tests for CloudResourceEnv state() method.
This module validates that the state() method returns consistent EnvState
instances that match the internal state values.
"""
import pytest
from hypothesis import given, strategies as st, settings
from env.environment import CloudResourceEnv
from env.config import EnvState
class TestStateMethodConsistency:
"""Property 3: State Method Consistency"""
@given(seed=st.integers(min_value=0, max_value=10000))
@settings(max_examples=50)
def test_state_matches_internal_state_after_reset(self, seed):
"""Test that state() returns EnvState matching internal state after reset()."""
env = CloudResourceEnv()
env.rng.seed(seed)
env.reset()
state = env.state()
assert isinstance(state, EnvState)
assert state.cpu == env.cpu_util
assert state.memory == env.memory_util
assert state.request_rate == float(env.request_rate)
assert state.resources == env.allocated_resources
@given(
seed=st.integers(min_value=0, max_value=10000),
action=st.integers(min_value=0, max_value=2)
)
@settings(max_examples=50)
def test_state_matches_internal_state_after_step(self, seed, action):
"""Test that state() returns EnvState matching internal state after step()."""
env = CloudResourceEnv()
env.rng.seed(seed)
env.reset()
env.step(action)
state = env.state()
assert isinstance(state, EnvState)
assert state.cpu == env.cpu_util
assert state.memory == env.memory_util
assert state.request_rate == float(env.request_rate)
assert state.resources == env.allocated_resources
@given(
seed=st.integers(min_value=0, max_value=10000),
actions=st.lists(st.integers(min_value=0, max_value=2), min_size=1, max_size=10)
)
@settings(max_examples=30)
def test_state_consistency_across_multiple_steps(self, seed, actions):
"""Test that state() remains consistent across multiple steps."""
env = CloudResourceEnv()
env.rng.seed(seed)
env.reset()
for action in actions:
if env.done:
break # Stop if episode terminates
env.step(action)
state = env.state()
# Verify state matches internal values
assert state.cpu == env.cpu_util
assert state.memory == env.memory_util
assert state.request_rate == float(env.request_rate)
assert state.resources == env.allocated_resources
class TestEnvStateStructureCompleteness:
"""Property 1: EnvState Structure Completeness"""
def test_state_returns_envstate_with_all_fields(self):
"""Test that state() returns EnvState with all four required fields."""
env = CloudResourceEnv()
env.rng.seed(42)
env.reset()
state = env.state()
assert isinstance(state, EnvState)
assert hasattr(state, 'cpu')
assert hasattr(state, 'memory')
assert hasattr(state, 'request_rate')
assert hasattr(state, 'resources')
@given(
seed=st.integers(min_value=0, max_value=10000),
task_name=st.sampled_from(["easy", "medium", "hard"])
)
@settings(max_examples=30)
def test_state_fields_have_correct_types(self, seed, task_name):
"""Test that state() returns EnvState with correctly typed fields."""
env = CloudResourceEnv(task_name=task_name)
env.rng.seed(seed)
env.reset()
state = env.state()
assert isinstance(state.cpu, float)
assert isinstance(state.memory, float)
assert isinstance(state.request_rate, float)
assert isinstance(state.resources, int)
@given(seed=st.integers(min_value=0, max_value=10000))
@settings(max_examples=50)
def test_state_fields_within_valid_ranges(self, seed):
"""Test that state() returns EnvState with fields in valid ranges."""
env = CloudResourceEnv()
env.rng.seed(seed)
env.reset()
state = env.state()
# EnvState validation ensures these constraints
assert 0.0 <= state.cpu <= 100.0
assert 0.0 <= state.memory <= 100.0
assert state.request_rate >= 0.0
assert state.resources >= 1
|