@@ -12,12 +12,61 @@ module Duckling.Recurrence.EN.Corpus
12
12
, negativeCorpus
13
13
) where
14
14
15
- import Prelude
16
- import Data.String
15
+ import Data.Aeson ( ToJSON (toJSON ), Object , Value (Object ) )
16
+ import qualified Data.HashMap.Strict as HashMap
17
+ import Data.Text (Text )
17
18
18
- import Duckling.Recurrence.Types
19
+ import Duckling.Recurrence.Types (RecurrenceValue (.. ))
20
+ import Duckling.Resolve (Context )
19
21
import Duckling.Testing.Types
22
+ ( examplesCustom ,
23
+ testContext ,
24
+ testOptions ,
25
+ Corpus ,
26
+ Datetime ,
27
+ Example ,
28
+ NegativeCorpus ,
29
+ TestPredicate )
30
+ import Duckling.Time.Corpus (datetime , datetimeHoliday )
31
+ import Duckling.Time.Types (TimeValue (.. ))
20
32
import Duckling.TimeGrain.Types (Grain (.. ))
33
+ import Duckling.Types (ResolvedToken (Resolved , rval ), ResolvedVal (RVal ))
34
+ import qualified Duckling.Recurrence.Types as TRecurrence
35
+
36
+ check :: ToJSON a => (Context -> a ) -> TestPredicate
37
+ check f context Resolved {rval = RVal _ v} = case toJSON v of
38
+ Object o -> deleteValues (toJSON (f context)) == deleteValues (Object o)
39
+ _ -> False
40
+ where
41
+ -- need to access and delete values if anchor is set
42
+ deleteValues :: Value -> Value
43
+ deleteValues (Object o) = do
44
+ case unwrapAnchor $ o HashMap. ! " anchor" of
45
+ Nothing -> Object o
46
+ Just a -> do
47
+ let anch = Object $ HashMap. delete " values" a
48
+ Object $ HashMap. insert " anchor" anch o
49
+ deleteValues _ = Object HashMap. empty
50
+
51
+ unwrapAnchor :: Value -> Maybe Object
52
+ unwrapAnchor (Object x) = Just x
53
+ unwrapAnchor _ = Nothing
54
+
55
+ examples :: ToJSON a => (Context -> a ) -> [Text ] -> [Example ]
56
+ examples f = examplesCustom (check f)
57
+
58
+ recurrence :: Int -> Int -> Grain -> Context -> RecurrenceValue
59
+ recurrence v t g ctx = RecurrenceValue {TRecurrence. rValue = v, TRecurrence. rTimes = t, TRecurrence. rGrain = g, TRecurrence. rAnchor = Nothing }
60
+
61
+ anchoredRecurrence :: Int -> Int -> Grain -> Datetime -> Grain -> Context -> RecurrenceValue
62
+ anchoredRecurrence v t g dt dtg ctx = RecurrenceValue {TRecurrence. rValue = v, TRecurrence. rTimes = t, TRecurrence. rGrain = g, TRecurrence. rAnchor = a}
63
+ where
64
+ a = Just $ datetime dt dtg ctx
65
+
66
+ anchoredRecurrenceHoliday :: Int -> Int -> Grain -> Datetime -> Grain -> Text -> Context -> RecurrenceValue
67
+ anchoredRecurrenceHoliday v t g dt dtg h ctx = RecurrenceValue {TRecurrence. rValue = v, TRecurrence. rTimes = t, TRecurrence. rGrain = g, TRecurrence. rAnchor = a}
68
+ where
69
+ a = Just $ datetimeHoliday dt dtg h ctx
21
70
22
71
corpus :: Corpus
23
72
corpus = (testContext, testOptions, allExamples)
@@ -35,53 +84,94 @@ negativeCorpus = (testContext, testOptions, examples)
35
84
36
85
allExamples :: [Example ]
37
86
allExamples = concat
38
- [ examples (RecurrenceData 1 Second Nothing )
39
- [ " every second"
40
- , " per second"
41
- , " each second"
42
- ]
43
- , examples (RecurrenceData 1 Minute Nothing )
44
- [ " every minute"
45
- , " per minute"
46
- , " every minute"
47
- ]
48
- , examples (RecurrenceData 1 Hour Nothing )
49
- [ " every hour"
50
- , " per hour"
51
- , " every hour"
52
- ]
53
- , examples (RecurrenceData 1 Day Nothing )
54
- [ " every day"
55
- , " per day"
56
- , " daily"
57
- ]
58
- , examples (RecurrenceData 2 Day Nothing )
59
- [ " every 2 days"
60
- , " per 2 days"
61
- ]
62
- , examples (RecurrenceData 1 Week Nothing )
63
- [ " every week"
64
- , " per week"
65
- , " weekly"
66
- ]
67
- , examples (RecurrenceData 2 Week Nothing )
68
- [ " every 2 weeks"
69
- , " per 2 week"
70
- , " biweekly"
71
- ]
72
- , examples (RecurrenceData 1 Month Nothing )
73
- [ " every month"
74
- , " per month"
75
- , " monthly"
76
- ]
77
- , examples (RecurrenceData 1 Year Nothing )
78
- [ " every year"
79
- , " per year"
80
- , " yearly"
81
- ]
82
- , examples (RecurrenceData 1 Decade Nothing )
83
- [ " every decade"
84
- , " per decade"
85
- , " each decade"
86
- ]
87
+ [ examples (recurrence 1 1 Second )
88
+ [ " every second"
89
+ , " per second"
90
+ , " each second"
91
+ ]
92
+ , examples (recurrence 1 1 Minute )
93
+ [ " every minute"
94
+ , " per minute"
95
+ , " every minute"
96
+ ]
97
+ , examples (recurrence 1 1 Hour )
98
+ [ " every hour"
99
+ , " per hour"
100
+ , " every hour"
101
+ , " hourly"
102
+ ]
103
+ , examples (recurrence 1 1 Day )
104
+ [ " every day"
105
+ , " per day"
106
+ , " daily"
107
+ , " once every day"
108
+ ]
109
+ , examples (recurrence 2 1 Day )
110
+ [ " every 2 days"
111
+ , " per 2 days"
112
+ , " bidaily"
113
+ ]
114
+ , examples (recurrence 1 1 Week )
115
+ [ " every week"
116
+ , " per week"
117
+ , " weekly"
118
+ ]
119
+ , examples (recurrence 2 1 Week )
120
+ [ " every 2 weeks"
121
+ , " per 2 week"
122
+ , " biweekly"
123
+ ]
124
+ , examples (recurrence 1 1 Month )
125
+ [ " every month"
126
+ , " per month"
127
+ , " monthly"
128
+ ]
129
+ , examples (recurrence 1 1 Year )
130
+ [ " every year"
131
+ , " per year"
132
+ , " yearly"
133
+ , " annually"
134
+ , " annual"
135
+ ]
136
+ , examples (recurrence 1 1 Decade )
137
+ [ " every decade"
138
+ , " per decade"
139
+ , " each decade"
140
+ ]
141
+ , examples (anchoredRecurrence 1 1 Week (2013 , 2 , 17 , 0 , 0 , 0 ) Day )
142
+ [ " every sunday"
143
+ , " per sunday"
144
+ , " each sunday"
145
+ ]
146
+ , examples (anchoredRecurrence 1 1 Year (2013 , 6 , 2 , 0 , 0 , 0 ) Day )
147
+ [ " every June 2nd"
148
+ , " per 2nd of June"
149
+ , " each Jun 2"
150
+ ]
151
+ , examples (recurrence 1 3 Day )
152
+ [ " thrice daily"
153
+ , " three times every day"
154
+ , " 3 times a day"
155
+ ]
156
+ , examples (recurrence 1 2 Week )
157
+ [ " twice weekly"
158
+ , " two times every week"
159
+ , " 2 times a week"
160
+ ]
161
+ , examples (recurrence 1 5 Year )
162
+ [ " five times each year"
163
+ , " five times yearly"
164
+ , " 5 times annually"
165
+ ]
166
+ , examples (anchoredRecurrenceHoliday 2 3 Year (2013 , 12 , 25 , 0 , 0 , 0 ) Day " Christmas" )
167
+ [ " three times every other christmas"
168
+ , " thrice each two xmas"
169
+ , " 3 times per alternating christmas day"
170
+ ]
171
+ , examples (recurrence 2 1 Quarter )
172
+ [ " every 2 quarters"
173
+ , " per 2 quarters"
174
+ , " biquarterly"
175
+ , " every two quarters"
176
+ ]
87
177
]
0 commit comments