File size: 2,831 Bytes
b625b53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# tests/test_granularity_analyzer.py
#
# Test suite for Statistical Granularity Analyzer.
# 8 tests covering digit preference, Benford's Law,
# round numbers, uniform precision, and risk levels.

import pytest
from src.scipeerai.modules.granularity_analyzer import GranularityAnalyzer

engine = GranularityAnalyzer()


def test_digit_preference_detected():
    """Too many 0s and 5s in decimal values."""
    text = (
        "Results: 2.50 3.50 4.50 1.50 2.00 3.00 "
        "4.00 5.00 1.00 6.50 7.50 8.00 n=20 p=0.05"
    )
    r = engine.analyze(text)
    assert r.flags_count >= 1
    assert r.risk_level in ("medium", "high", "critical")


def test_clean_data_passes():
    """Natural varied decimal values — low risk."""
    text = (
        "Values recorded: 2.34 1.87 3.92 4.13 2.76 "
        "1.53 3.47 2.19 4.82 1.63 n=45 p=0.032"
    )
    r = engine.analyze(text)
    assert r.risk_level in ("low", "medium")


def test_insufficient_data():
    """Less than 5 decimal values — low risk."""
    r = engine.analyze(
        "The study found significant results with "
        "p=0.04 and mean=2.5 in the sample group."
    )
    assert r.risk_level == "low"


def test_round_numbers_detected():
    """All whole number decimals — suspicious."""
    text = (
        "mean=1.0 sd=2.0 score=3.0 value=4.0 "
        "outcome=5.0 measure=6.0 result=7.0 n=20"
    )
    r = engine.analyze(text)
    assert r.flags_count >= 1


def test_granularity_score_range():
    """Score must be between 0 and 1."""
    text = (
        "Results showed mean=2.50 sd=1.00 p=0.050 n=20. "
        "Secondary mean=3.50 sd=2.00 p=0.040 n=15."
    )
    r = engine.analyze(text)
    assert 0.0 <= r.granularity_score <= 1.0


def test_flag_structure():
    """Flags have correct fields."""
    text = (
        "Results: 2.50 3.50 4.50 1.50 2.00 3.00 "
        "4.00 5.00 1.00 6.50 n=20 p=0.05"
    )
    r = engine.analyze(text)
    if r.flags_count > 0:
        flag = r.flags[0]
        assert hasattr(flag, 'flag_type')
        assert hasattr(flag, 'severity')
        assert hasattr(flag, 'description')
        assert hasattr(flag, 'evidence')
        assert hasattr(flag, 'suggestion')


def test_summary_contains_key_info():
    """Summary mentions anomaly score and risk level."""
    text = (
        "Results showed mean=2.50 sd=1.00 p=0.050 n=20. "
        "Values: 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0"
    )
    r = engine.analyze(text)
    assert "Granularity" in r.summary
    assert r.risk_level.upper() in r.summary


def test_risk_level_valid():
    """Risk level must be one of four valid values."""
    text = (
        "Results showed mean=2.50 sd=1.00 p=0.050 n=20. "
        "Secondary mean=3.50 sd=2.00 p=0.040 n=15."
    )
    r = engine.analyze(text)
    assert r.risk_level in ("low", "medium", "high", "critical")