Subversion Repositories SmartDukaan

Rev

Rev 37167 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
37167 amit 1
package com.spice.profitmandi.service;
2
 
3
import com.spice.profitmandi.dao.enumuration.dtr.AgendaType;
4
import org.junit.Test;
5
 
6
import java.util.HashMap;
7
import java.util.Map;
8
 
9
import static org.junit.Assert.assertEquals;
10
 
11
public class AgendaRuleDecisionTest {
12
 
13
    private static Map<String, Double> params(Object... kv) {
14
        Map<String, Double> m = new HashMap<>();
15
        for (int i = 0; i < kv.length; i += 2) {
16
            m.put((String) kv[i], ((Number) kv[i + 1]).doubleValue());
17
        }
18
        return m;
19
    }
20
 
21
    private static Map<String, Double> salesDefaults() {
22
        return params("flagPct", 40, "clearPct", 75, "baselineDays", 90, "windowDays", 30);
23
    }
24
 
25
    private static AgendaRuleDecider.Inputs baseInputs() {
26
        AgendaRuleDecider.Inputs in = new AgendaRuleDecider.Inputs();
27
        in.fofoId = 1;
28
        in.revival = false;
29
        in.storeActivatedRecently = false;
30
        in.minInvestment = 300000;
31
        in.shortPercentage = 10d;
32
        in.baselineAmt = 300000; // monthlyBaseline = 100000
33
        in.currentAmt = 100000;
34
        in.lastBillDaysAgo = 3;
35
        in.oldestLoanAgeDays = null;
36
        in.pendingLoanAmt = 0;
37
        return in;
38
    }
39
 
40
    private static Map<AgendaType, AgendaRuleDecider.Decision> decide(AgendaRuleDecider.Inputs in) {
41
        return AgendaRuleDecider.decide(in,
42
                params("shortPct", 50), salesDefaults(), params("gapDays", 15), params("loanAgeDays", 20));
43
    }
44
 
45
    @Test
46
    public void salesHysteresisHoldsBetweenBarriers() {
47
        AgendaRuleDecider.Inputs in = baseInputs();
48
        in.currentAmt = 60000; // 60% of baseline: between 40 and 75
49
        assertEquals(AgendaRuleDecider.Action.LEAVE, decide(in).get(AgendaType.LOW_SALES).action);
50
    }
51
 
52
    @Test
53
    public void salesFlagsBelow40AndClearsAbove75() {
54
        AgendaRuleDecider.Inputs in = baseInputs();
55
        in.currentAmt = 39999;
56
        assertEquals(AgendaRuleDecider.Action.OPEN, decide(in).get(AgendaType.LOW_SALES).action);
57
        in.currentAmt = 75001;
58
        assertEquals(AgendaRuleDecider.Action.CLOSE, decide(in).get(AgendaType.LOW_SALES).action);
59
    }
60
 
61
    @Test
62
    public void salesSkipsOnZeroBaselineAndYoungStores() {
63
        AgendaRuleDecider.Inputs in = baseInputs();
64
        in.baselineAmt = 0;
65
        in.currentAmt = 0;
66
        assertEquals(AgendaRuleDecider.Action.LEAVE, decide(in).get(AgendaType.LOW_SALES).action);
67
        AgendaRuleDecider.Inputs young = baseInputs();
68
        young.storeActivatedRecently = true;
69
        young.currentAmt = 0;
70
        assertEquals(AgendaRuleDecider.Action.LEAVE, decide(young).get(AgendaType.LOW_SALES).action);
71
    }
72
 
73
    @Test
37180 amit 74
    public void revivalSuppressesAllDataDrivenAgendasExceptCreditDues() {
37167 amit 75
        AgendaRuleDecider.Inputs in = baseInputs();
76
        in.revival = true;
37180 amit 77
        in.lastBillDaysAgo = 200;   // would flag LOW_PURCHASE
78
        in.shortPercentage = 90d;   // would flag LOW_INVESTMENT
79
        in.currentAmt = 0;          // would flag LOW_SALES
80
        in.oldestLoanAgeDays = 45;  // must STILL flag CREDIT_DUES
81
        in.pendingLoanAmt = 10000;
82
        Map<AgendaType, AgendaRuleDecider.Decision> d = decide(in);
83
        assertEquals(AgendaRuleDecider.Action.CLOSE, d.get(AgendaType.LOW_PURCHASE).action);
84
        assertEquals(AgendaRuleDecider.Action.CLOSE, d.get(AgendaType.LOW_INVESTMENT).action);
85
        assertEquals(AgendaRuleDecider.Action.CLOSE, d.get(AgendaType.LOW_SALES).action);
86
        assertEquals(AgendaRuleDecider.Action.OPEN, d.get(AgendaType.CREDIT_DUES).action);
87
        assertEquals(AgendaRuleDecider.Action.OPEN, d.get(AgendaType.REVIVAL).action);
37167 amit 88
    }
89
 
90
    @Test
91
    public void purchaseFlagsAtGapAndNeverBilled() {
92
        AgendaRuleDecider.Inputs in = baseInputs();
93
        in.lastBillDaysAgo = 15; // exactly gapDays
94
        assertEquals(AgendaRuleDecider.Action.OPEN, decide(in).get(AgendaType.LOW_PURCHASE).action);
95
        in.lastBillDaysAgo = null; // never billed, non-revival
96
        assertEquals(AgendaRuleDecider.Action.OPEN, decide(in).get(AgendaType.LOW_PURCHASE).action);
97
        in.lastBillDaysAgo = 14;
98
        assertEquals(AgendaRuleDecider.Action.CLOSE, decide(in).get(AgendaType.LOW_PURCHASE).action);
99
    }
100
 
101
    @Test
102
    public void creditFlagsAtExactThreshold() {
103
        AgendaRuleDecider.Inputs in = baseInputs();
104
        in.oldestLoanAgeDays = 20;
105
        in.pendingLoanAmt = 50000;
106
        assertEquals(AgendaRuleDecider.Action.OPEN, decide(in).get(AgendaType.CREDIT_DUES).action);
107
        in.oldestLoanAgeDays = 19;
108
        assertEquals(AgendaRuleDecider.Action.CLOSE, decide(in).get(AgendaType.CREDIT_DUES).action);
109
    }
110
 
111
    @Test
112
    public void investmentUsesFiftyTriggerAndSkipsWhenUncomputable() {
113
        AgendaRuleDecider.Inputs in = baseInputs();
114
        in.shortPercentage = 51d;
115
        assertEquals(AgendaRuleDecider.Action.OPEN, decide(in).get(AgendaType.LOW_INVESTMENT).action);
116
        in.shortPercentage = 50d;
117
        assertEquals(AgendaRuleDecider.Action.CLOSE, decide(in).get(AgendaType.LOW_INVESTMENT).action);
118
        in.shortPercentage = null;
119
        assertEquals(AgendaRuleDecider.Action.LEAVE, decide(in).get(AgendaType.LOW_INVESTMENT).action);
120
    }
121
}