GFESuite Automated Test Case - RoutineLevel5_3_TestScript


0      # ----------------------------------------------------------------------------
1      # This software is in the public domain, furnished "as is", without technical
2      # support, and with no warranty, express or implied, as to its usefulness for
3      # any purpose.
4      #
5      # RoutineLevel5_3_TestScript    
6      # Author:
7      # ----------------------------------------------------------------------------
8     
9      # First run setupTextEA
10    
11     import TestScript
12    
13     # For FWF_InfiniteLoops
14     checkResolution = """
15    
16         def checkResolution(self, tree, node):
17             # Check to see if there are too many sub-phrases and we need to re-do the
18             # phrase in lower resolution. The limit is determined by "subPhrase_limit".
19             # This currently assumes we have a 3 or greater resolution and want to go to
20             # a 6-hour resolution.
21             
22             # See if ready to process
23             if not self.phrase_trigger(tree, node):
24                 return
25             
26             # Count the number of non-empty phrases
27             #print "In check resolution", node
28             count = 0
29             for subPhrase in node.get("childList"):
30                 words = subPhrase.get("words")
31                 if words == "":
32                     continue
33                 #print "words", subPhrase, words
34                 count += 1
35             if count > self.subPhrase_limit(tree, node):
36                 #print "count", count
37                 # Create a new node in it's place with a new
38                 # resolution set           
39                 newPhrase = tree.addPhraseDef(node, self.weather_phrase)
40     ##            newPhrase.set("disabledSubkeys", node.get("disabledSubkeys"))
41                 curResolution = node.get("resolution")
42     ##            if curResolution is not None:
43     ##                # If we have already re-set the resolution and we are still over the
44     ##                # sub-phrase limit, we'll have to decrease the resolution some more
45     ##                # to try and reduce the number of sub-phrases.
46     ##                # This is necessary because of the way preProcessWx works:
47     ##                # For example, even if we have only 2 time periods sampled,
48     ##                # they can result in 3 or more sub-phrases depending on the
49     ##                # complexity of weather.
50     ##                # Example:  Hours 1-6  Chc RW Chc L
51     ##                #           Hours 7-12 Chc SW Chc L
52     ##                #   Results in 3 sub-phrases
53     ##                #           Hours 1-12 Chc L
54     ##                #           Hours 1-6  Chc RW
55     ##                #           Hours 7-12 Chc SW
56     ##                newResolution = curResolution * 2
57     ##            else:
58     ##                newResolution = 6
59                 newResolution = 6
60                 newPhrase.set("resolution", newResolution)
61                 #print "making newPhrase", newPhrase
62                 #print "parent should be", node.parent
63                 #tree.printNode(newPhrase)
64                 # Remove this node
65                 node.remove()
66             return self.DONE()
67         
68    
69     """
70    
71     subPhrase_limit = """
72    
73         def subPhrase_limit(self, tree, node):
74             return 2
75    
76     """
77    
78     checkResolution2 = """
79    
80         def checkResolution(self, tree, node):
81             # Check to see if there are too many sub-phrases and we need to re-do the
82             # phrase in lower resolution. The limit is determined by "subPhrase_limit".
83             # This currently assumes we have a 3 or greater resolution and want to go to
84             # a 6-hour resolution.
85             
86             # See if ready to process
87             if not self.phrase_trigger(tree, node):
88                 return
89             
90             # Count the number of non-empty phrases
91             #print "In check resolution", node
92             count = 0
93             for subPhrase in node.get("childList"):
94                 words = subPhrase.get("words")
95                 if words == "":
96                     continue
97                 #print "words", subPhrase, words
98                 count += 1
99             if count > self.subPhrase_limit(tree, node):
100                #print "count", count
101                # Create a new node in it's place with a new
102                # resolution set
103                exec "newPhraseDef = self." + node.getAncestor('name')
104                newPhrase = tree.addPhraseDef(node, self.skyPopWx_phrase)
105                newPhrase.set("disabledSubkeys", node.get("disabledSubkeys"))
106                curResolution = node.get("resolution")
107                if curResolution is not None:
108                    # If we have already re-set the resolution and we are still over the
109                    # sub-phrase limit, we'll have to decrease the resolution some more
110                    # to try and reduce the number of sub-phrases.
111                    # This is necessary because of the way preProcessWx works:
112                    # For example, even if we have only 2 time periods sampled,
113                    # they can result in 3 or more sub-phrases depending on the
114                    # complexity of weather.
115                    # Example:  Hours 1-6  Chc RW Chc L
116                    #           Hours 7-12 Chc SW Chc L
117                    #   Results in 3 sub-phrases
118                    #           Hours 1-12 Chc L
119                    #           Hours 1-6  Chc RW
120                    #           Hours 7-12 Chc SW
121                    newResolution = curResolution * 2
122                else:
123                    newResolution = 6
124                newPhrase.set("resolution", newResolution)
125                #print "making newPhrase", newPhrase
126                #print "parent should be", node.parent
127                #tree.printNode(newPhrase)
128                # Remove this node
129                node.remove()
130            return self.DONE()
131   
132    """
133   
134    period1 = """
135   
136   
137        def Period_1(self):
138            component =  { 
139                "type": "component",
140                "methodList": [
141                              self.orderPhrases,
142                              self.assemblePhrases,   
143                              self.wordWrap,          
144                              ],
145                "analysisList": [
146                           #("MinT", self.avg),
147                           #("MaxT", self.avg),
148                           ("MinT", self.stdDevMinMax),
149                           ("MaxT", self.stdDevMinMax),
150                           ("T", self.hourlyTemp),
151                           ("T", self.minMax),
152                           ("Sky", self.median, [3]),
153                           ("PoP", self._PoP_analysisMethod("Period_1"), [3]),
154                           ("PoP", self.binnedPercent, [3]),
155                           ("SnowAmt", self.accumMinMax),
156                           ("StormTotalSnow", self.accumMinMax),
157                           ("IceAccum", self.accumMinMax),
158                           ("SnowLevel", self.avg),
159                           ("Wind", self.vectorMedianRange, [6]),
160                           ("Wind", self.vectorMinMax, [6]),
161                           ("WindGust", self.maximum, [6]),
162                           ("Wx", self.rankedWx, [0]),
163                           ("WindChill", self.minMax, [6]),
164                           ("HeatIndex", self.minMax, [6]),
165                           ],
166                "phraseList":[
167                       self.sky_phrase,
168                       self.skyPopWx_phrase,
169                       self.wind_summary,
170                       self.reportTrends,
171                       self.weather_phrase,
172                       self.severeWeather_phrase,
173                       self.heavyPrecip_phrase,
174                       self.visibility_phrase,
175                       self.snow_phrase,
176                       self.total_snow_phrase,
177                       self.snowLevel_phrase,
178                       self.iceAccumulation_phrase,
179                       self.highs_phrase,
180                       self.lows_phrase,
181                       #self.highs_range_phrase,
182                       #self.lows_range_phrase,
183                       #self.steady_temp_trends,
184                       self.temp_trends,
185                       self.wind_withGusts_phrase,
186                       self.lake_wind_phrase,
187                       self.popMax_phrase,
188                       self.windChill_phrase,
189                       # Alternative
190                       #self.windBased_windChill_phrase,
191                       self.heatIndex_phrase,
192                       ],
193    ##            "additionalAreas": [ 
194    ##                   # Areas listed by weather element that will be
195    ##                   # sampled and analysed.
196    ##                   # E.g. used for reporting population centers for temperatures. 
197    ##                   ("MaxT", ["City1", "City2"]),
198    ##                   ("MinT", ["City1", "City2"]),
199    ##                   ],
200    ##            "intersectAreas": [ 
201    ##                   # Areas listed by weather element that will be
202    ##                   # intersected with the current area then
203    ##                   # sampled and analysed.  
204    ##                   # E.g. used in local effects methods.
205    ##                   ("MaxT", ["Mountains"]),
206    ##                   ("MinT", ["Valleys"]),
207    ##             ],
208            }
209            if self._arealSkyAnalysis:
210                component["analysisList"].append(("Sky", self.binnedPercent, [3]))
211            if self._useStormTotalSnow:
212                phraseList = component["phraseList"]
213                index = phraseList.index(self.total_snow_phrase)
214                phraseList[index] = self.stormTotalSnow_phrase
215                component["phraseList"] = phraseList
216            return component    
217   
218    """
219   
220   
221    ### For areal sky
222   
223    arealSkyDef1 = """#Definition["arealSkyAnalysis"] = 1"""
224    arealSkyDef2 = """Definition["arealSkyAnalysis"] = 1"""
225   
226    arealSky = """
227   
228        def areal_sky_flag(self, tree, node):
229            return 1
230    """
231   
232    ### For diurnal sky
233   
234    periodCombine1 = """#Definition["periodCombining"] = 1"""
235    periodCombine2 = """Definition["periodCombining"] = 1"""
236   
237    diurnalSky = """
238   
239        def periodCombining_elementList(self, tree, node):
240            # Weather Elements to determine whether to combine periods
241            #return ["Sky", "Wind", "Wx", "PoP", "MaxT", "MinT"]
242            # Marine
243            #return ["WaveHeight", "Wind", "Wx"]
244            # Diurnal Sky Wx pattern
245            return ["DiurnalSkyWx"]
246   
247   
248    """
249   
250    pcElementList = """
251   
252        def periodCombining_elementList(self, tree, node):
253            # Weather Elements to determine whether to combine periods
254            #return ["Sky", "Wind", "Wx", "PoP", "MaxT", "MinT"]
255            # Marine
256            #return ["WaveHeight", "Wind", "Wx"]
257            # Diurnal Sky Wx pattern
258            #return ["DiurnalSkyWx"]
259            return ["Wx", "PoP"]
260   
261    """
262   
263    increaseSky1 = """
264   
265        def reportIncreasingDecreasingSky_flag(self, tree, node):
266            # If 1, AND the difference is greater than the increasingDecreasing_threshold
267            # will use "increasing clouds", "decreasing clouds"
268            # wording instead of "mostly cloudy becoming sunny"
269            return 1
270   
271    """
272   
273    increaseSky2 = """
274   
275        def reportIncreasingDecreasingSky_flag(self, tree, node):
276            # If 1, will use "increasing clouds", "decreasing clouds"
277            # wording instead of "mostly cloudy becoming sunny"
278            #return 0
279            #return 1
280       
281            # Use the following code to avoid redundancy e.g.
282            #  SUNDAY...Increasing clouds.
283            #  SUNDAY NIGHT...Increasing clouds.
284            #
285            #If the previous period had increasing or decreasing wording, return 0
286            # Otherwise, return 1
287   
288            # Check to see if previous period had increasing or decreasing wording
289            component = node.getComponent()
290            prevComp = component.getPrev()
291            if prevComp is not None:
292                # Look at the sky_phrase
293                skyWords = self.findWords(
294                    tree, prevComp, "Sky", node.getAreaLabel(),
295                    phraseList=[node.getAncestor('name')], phraseLevel=1)
296                if skyWords is not None:
297                    if skyWords.find("increasing") >= 0 or \
298                       skyWords.find("decreasing") >= 0:
299                        return 0                     
300                return 1
301            return 1    
302    """
303   
304    ### For headlinesTiming
305   
306    headlinesTiming = """
307   
308        def allowedHeadlines(self):
309            allActions = []
310            return [
311                ('LocalHazard1', allActions, 'Tropical'),
312                ]
313        
314        def _preProcessArea(self, fcst, editArea, areaLabel, argDict):
315            # This is the header for an edit area combination
316            areaHeader = self.makeAreaHeader(
317                argDict, areaLabel, self._issueTime, self._expireTime,
318                self._areaDictionary, self._defaultEditAreas)
319            fcst = fcst + areaHeader
320   
321            # get the hazards text
322            self._hazards = argDict['hazards']
323            self._combinations = argDict["combinations"]
324   
325            headlines = self.generateProduct("Hazards", argDict, area = editArea,
326                                             areaLabel=areaLabel,
327                                             timeRange = self._timeRange)
328   
329            headlines_local = self.generateProduct("Headlines", argDict, area = editArea,
330                                             areaLabel=areaLabel,
331                                             timeRange = self._timeRange)
332            
333            fcst = fcst + headlines + headlines_local
334                
335            return fcst
336            
337    """
338   
339    headlinesTiming1 = """
340   
341        def headlinesTiming(self, tree, node, key, timeRange, areaLabel, issuanceTime):
342            return "DAY_NIGHT_ONLY", "DAY_NIGHT_ONLY", 0
343   
344    """
345   
346    headlinesTiming2 = """
347   
348        def headlinesTiming(self, tree, node, key, timeRange, areaLabel, issuanceTime):
349            return "FUZZY", "FUZZY", 3
350   
351    """
352    headlinesTiming3 = """
353   
354        def headlinesTiming(self, tree, node, key, timeRange, areaLabel, issuanceTime):
355            return "EXPLICIT", "FUZZY", 3
356   
357    """
358   
359    headlinesTiming4 = """
360   
361        def headlinesTiming(self, tree, node, key, timeRange, areaLabel, issuanceTime):
362            return "EXPLICIT", "EXPLICIT", 3
363   
364    """
365    localHeadlines1 = """
366   
367        def allowedHazards(self):
368            allActions = ["NEW", "EXA", "EXB", "EXT", "UPG", "CAN", "CON", "EXP"]
369            return [
370                ('WS.W', allActions, 'WinterWx'),     # WINTER STORM WARNING
371                ('LocalHazard1', allActions, 'Misc'),
372                 ]
373        
374    """
375   
376    hoursSChc1 = """#Definition["hoursSChcEnds"] = 24"""
377    hoursSChc2 = """Definition["hoursSChcEnds"] = 84"""
378   
379    null_distinct = """
380   
381        def null_alwaysDistinct_flag_dict(self, tree, node):
382            # If 1, null values will always be considered distinct from non-null values
383            # when combining subphrases.  Thus, with a null value of 5,
384            # you may end up with phrases such as:
385            #   Winds less than 5 mph becoming east 5 mph.
386            # If set to 0, the determination will be made based on the scalar or
387            # vector difference as with non-null values.
388            #   (See scalar_difference_nlValue_dict and vector_mag_difference_nlValue_dict)
389            return {
390                "otherwise": 1,
391                "Wind": 0,  
392                }
393    """
394   
395    tempCov = """
396   
397        def temporalCoverage_dict(self, parmHisto, timeRange, componentName):
398            # This is temporalCoverage percentage by weather element
399            # Used by temporalCoverage_flag
400            return {
401                    "LAL": 0,
402                    "MinRH": 0,
403                    "MaxRH": 0,
404                    "MinT": 1,
405                    "MaxT": 1,
406                    "Haines": 0,
407                    "PoP" : 20,
408                    "Hazards" : 0,
409                    }
410   
411   
412    """
413   
414    CWFPeriod = """
415        def _issuance_list(self, argDict):
416            #  This method sets up configurable issuance times with associated
417            #  narrative definitions.  See the Text Product User Guide for documentation.
418            if self._definition["includeEveningPeriod"] == 1:
419                narrativeDefAM = [
420                    ("CWFPeriod", "period1"),
421    ##                ("", 12),# ("", 12), ("", 12), ("", 12),
422    ##                ("", 12),
423    ##                ("CWFExtended", 24), ("CWFExtended", 24)
424                    ]
425                narrativeDefPM = [
426                    ("", "period1"),
427                    ("", 12), ("", 12), ("", 12), ("", 12),
428                    ("", 12), ("", 12),
429                    ("CWFExtended", 24), ("CWFExtended", 24)
430                    ]
431            else:
432                narrativeDefAM = [
433                    ("", "period1"),
434                    ("", 12), ("", 12), ("", 12), ("", 24),
435                    ("CWFExtended", 24), ("CWFExtended", 24)
436                    ]
437                narrativeDefPM = [
438                    ("", "period1"),
439                    ("", 12), ("", 12), ("", 12), ("", 12),
440                    ("CWFExtended", 24),
441                    ("CWFExtended", 24), ("CWFExtended", 24)
442                    ]
443            
444            return [
445                ("430 AM", self.DAY(), self.NIGHT(), self.NIGHT(),
446                 ".TODAY...", "early in the morning", "late in the afternoon",
447                 1, narrativeDefAM),
448                ("1030 AM", "issuanceHour", self.NIGHT(), self.NIGHT(),
449                 ".TODAY...", "early in the morning", "late in the afternoon",
450                 1, narrativeDefAM),
451                #  End times are tomorrow:
452                ("430 PM", self.NIGHT(), 24 + self.DAY(), 24 + self.DAY(),
453                 ".TONIGHT...", "late in the night", "early in the evening",
454                 1, narrativeDefPM),
455                ("1030 PM", "issuanceHour", 24 + self.DAY(), 24 + self.DAY(),
456                 ".TONIGHT...", "late in the night", "early in the evening",
457                 1, narrativeDefPM),
458                ]
459   
460   
461        def CWFPeriod(self):
462            return {
463                "type": "component",
464                "methodList": [
465                              self.assemblePhrases,   
466                              self.wordWrap,          
467                              ],
468                
469                "analysisList": [            
470                          # NOTE: Choose from the following analysis options.
471                          # Do not remove the "vectorMinMax" analysis for
472                          # "Wind". This is necessary to get an absolute max if
473                          # the useWindsForGusts flag is on.
474                
475                          # Use the following if you want moderated ranges 
476                          # (e.g. N WIND 10 to 20 KT)
477                          # Set the moderating percentage in the "moderated_dict"
478                          # dictionary module.
479                          # Set the maximum range values in the "maximum_range_nlValue_dict"
480                          # dictionary module.
481                              ("Wind", self.vectorModeratedMinMax, [3]),
482                              ("Wind", self.vectorMinMax, [12]),
483                              ("WindGust", self.moderatedMax, [3]),
484                              ("WaveHeight", self.moderatedMinMax, [6]),
485                              ("WindWaveHgt", self.moderatedMinMax, [6]),
486                              ("Swell", self.vectorModeratedMinMax, [6]),
487                              ("Swell2", self.vectorModeratedMinMax, [6]),
488                              ("Period", self.moderatedMinMax, [6]),
489                              ("Period2", self.moderatedMinMax, [6]),
490                              ("Wx", self.rankedWx, [6]),
491                              ("T", self.minMax),
492                              ("PoP", self._PoP_analysisMethod("CWFPeriod"), [6]),
493                              ("PoP", self.binnedPercent, [6]),
494                              ],
495   
496                 "phraseList":[
497                               # WINDS
498                               self.marine_wind_withGusts_phrase,
499                               # Alternative:
500                               #self.marine_wind_phrase,
501                               #self.gust_phrase,
502                               # WAVES
503                               self.wave_withPeriods_phrase,
504                               # Alternative:
505                               #self.wave_phrase,
506                               # Optional:
507                               self.chop_phrase,
508                               # SWELLS AND PERIODS
509                               self.swell_phrase,
510                               # Alternative:
511                               #self.swell_phrase,
512                               #self.period_phrase,
513                               # WEATHER
514                               self.weather_phrase,
515                               ],
516                }
517   
518        def seasFlag(self, tree, node):
519            return 0
520   
521    """
522   
523    nullSwell = """
524   
525        def first_null_phrase_dict(self, tree, node):
526            dict = TextRules.TextRules.first_null_phrase_dict(self, tree, node)
527            dict["Swell"] = "light swells"
528            return dict
529   
530        def null_phrase_dict(self, tree, node):
531            dict = TextRules.TextRules.null_phrase_dict(self, tree, node)
532            dict["Swell"] = "light"
533            return dict
534   
535   
536    """
537   
538    marine_wx = """
539   
540        def pop_wx_lower_threshold(self, tree, node):
541            # Always report weather
542            return 20
543   
544    """
545   
546    scripts = [
547   
548   
549        ### FWF Infinite Loop  TK 4244
550        {
551        "name": "FWF_InfiniteLoop1",
552        "commentary": "Wx Infinite Loop: Formatter fails since we need to change 'on-the-fly' \nresolution multiple times.",
553        "productType": "FWF",
554        "createGrids": [
555           ("Fcst", "PoP", "SCALAR", 0, 12, 60, "all", 1),
556           ("Fcst", "Wx", "WEATHER", 0, 3, "Chc:RW:-:<NoVis>:", "all"),
557           ("Fcst", "Wx", "WEATHER", 3, 6, "Chc:T:<NoInten>:<NoVis>:^Chc:RW:-:<NoVis>:", "all"),
558           ("Fcst", "Wx", "WEATHER", 6, 12,"Chc:RW:-:<NoVis>:^Chc:SW:-:<NoVis>:", "all"),
559           ],
560        "checkStrings": [
561           "|* PLEASE ENTER WEATHER_PHRASE AND REFER TO LOG FILES FOR MORE EXPLANATION *|",
562           ],
563        "fileChanges": [
564           ("FWF_<site>_Overrides", "TextUtility", "add", checkResolution, "undo"),
565           ("FWF_<site>_Overrides", "TextUtility", "add", subPhrase_limit, "undo"),
566           ],
567        "comboFlag": 1,
568                        
569        },
570        {
571        "name": "FWF_InfiniteLoop2",
572        "commentary": "Wx Infinite Loop: Formatter will succeed since we change  'on-the-fly' \nresolution multiple times.",
573        "productType": "FWF",
574        "createGrids": [
575           ("Fcst", "PoP", "SCALAR", 0, 12, 60, "all", 1),
576           ("Fcst", "Wx", "WEATHER", 0, 3, "Chc:RW:-:<NoVis>:", "all"),
577           ("Fcst", "Wx", "WEATHER", 3, 6, "Chc:T:<NoInten>:<NoVis>:^Chc:RW:-:<NoVis>:", "all"),
578           ("Fcst", "Wx", "WEATHER", 6, 12,"Chc:RW:-:<NoVis>:^Chc:SW:-:<NoVis>:", "all"),
579           ],
580        "checkStrings": [
581           "TODAY",
582           ("CHANCE OF SHOWERS...THUNDERSTORMS AND SNOW SHOWERS",
583            "CHANCE OF RAIN SHOWERS...THUNDERSTORMS AND SNOW SHOWERS"),
584            "TONIGHT",
585           ],
586        "fileChanges": [
587           ("FWF_<site>_Overrides", "TextUtility", "add", subPhrase_limit, "undo"),
588           ],
589        "comboFlag": 1,                    
590        },
591        
592        {
593        "name": "FWF_InfiniteLoop3",
594        "commentary": "Wx Infinite Loop: Formatter fails since we need to carry over disabledSubkeys.",
595        "productType": "FWF",
596        "createGrids": [
597           ("Fcst", "MaxT", "SCALAR", "MaxTBegin", "MaxTEnd", 21, "all"),
598           ("Fcst", "PoP", "SCALAR", 0, 12, 60, "all", 1),
599           ("Fcst", "Wx", "WEATHER", 0, 2, "Sct:SW:-:<NoVis>:^Areas:BS:<NoInten>:<NoVis>:", "all"),
600           ("Fcst", "Wx", "WEATHER", 2, 4, "Iso:T:<NoInten>:<NoVis>:^Sct:RW:-:<NoVis>:", "all"),
601           ("Fcst", "Wx", "WEATHER", 4, 6, "Sct:SW:-:<NoVis>:", "all"),
602           ("Fcst", "Wx", "WEATHER", 6, 12, "Sct:RW:-:<NoVis>:", "all"),
603           ],
604        "checkStrings": [
605           "|* PLEASE ENTER WEATHER_PHRASE AND REFER TO LOG FILES FOR MORE EXPLANATION *|",
606           ],
607        "fileChanges": [
608           ("FWF_<site>_Overrides", "TextUtility", "add", checkResolution, "undo"),
609           ],
610        "comboFlag": 1,
611                        
612        },
613        {
614        "name": "FWF_InfiniteLoop4",
615        "commentary": "Wx Infinite Loop: Formatter will succeed since carry over disabledSubkeys.",
616        "productType": "FWF",
617        "createGrids": [
618           ("Fcst", "MaxT", "SCALAR", "MaxTBegin", "MaxTEnd", 21, "all"),
619           ("Fcst", "PoP", "SCALAR", 0, 12, 60, "all", 1),
620           ("Fcst", "Wx", "WEATHER", 0, 2, "Sct:SW:-:<NoVis>:^Areas:BS:<NoInten>:<NoVis>:", "all"),
621           ("Fcst", "Wx", "WEATHER", 2, 4, "Iso:T:<NoInten>:<NoVis>:^Sct:RW:-:<NoVis>:", "all"),
622           ("Fcst", "Wx", "WEATHER", 4, 6, "Sct:SW:-:<NoVis>:", "all"),
623           ("Fcst", "Wx", "WEATHER", 6, 12, "Sct:RW:-:<NoVis>:", "all"),
624           ],
625        "checkStrings": [
626           "TODAY", "AREAS OF BLOWING SNOW UNTIL 0800",
627           "SCATTERED SNOW SHOWERS AND ISOLATED THUNDERSTORMS UNTIL 1200",
628           "SCATTERED SHOWERS","TONIGHT",
629           ],
630        "fileChanges": [],
631        "comboFlag": 1,                    
632        },
633   
634        {
635        "name": "ZFP_InfiniteLoop1",  # TK 4603
636        "commentary": "Infinite loop",
637        "productType": "ZFP",
638        "createGrids": [
639           ("Fcst", "Wx", "WEATHER", 0, 1, "Patchy:F:<NoInten>:<NoVis>:", "all"),
640           ("Fcst", "Wx", "WEATHER", 1, 2, "NoWx", "all"),
641           ("Fcst", "Wx", "WEATHER", 2, 3, "Patchy:F:<NoInten>:<NoVis>:", "all"),
642           ("Fcst", "Wx", "WEATHER", 3, 4, "NoWx", "all"),
643           ("Fcst", "Wx", "WEATHER", 4, 5, "Patchy:F:<NoInten>:<NoVis>:", "all"),
644           ("Fcst", "Wx", "WEATHER", 5, 6, "NoWx", "all"),
645           ("Fcst", "Wx", "WEATHER", 6, 7, "Patchy:F:<NoInten>:<NoVis>:", "all"),
646           ("Fcst", "Wx", "WEATHER", 7, 12, "NoWx", "all"),
647           ],
648        "notCheckStrings": [
649           "PATCHY FOG",  # no longer fails in infinite loop,
650                          # but does not produce PATCHY FOG as it should.
651           ],
652        "fileChanges": [
653           ("ZFP_<site>_Overrides", "TextUtility", "add", checkResolution2, "undo"),
654           ("ZFP_<site>_Overrides", "TextUtility", "add", period1, "undo"),
655           ],
656   
657        },
658   
659        {
660        "name": "ZFP_InfiniteLoop2",
661        "commentary": "Infinite loop fix",
662        "productType": "ZFP",
663        "createGrids": [
664           ("Fcst", "Wx", "WEATHER", 0, 1, "Patchy:F:<NoInten>:<NoVis>:", "all"),
665           ("Fcst", "Wx", "WEATHER", 1, 2, "NoWx", "all"),
666           ("Fcst", "Wx", "WEATHER", 2, 3, "Patchy:F:<NoInten>:<NoVis>:", "all"),
667           ("Fcst", "Wx", "WEATHER", 3, 4, "NoWx", "all"),
668           ("Fcst", "Wx", "WEATHER", 4, 5, "Patchy:F:<NoInten>:<NoVis>:", "all"),
669           ("Fcst", "Wx", "WEATHER", 5, 6, "NoWx", "all"),
670           ("Fcst", "Wx", "WEATHER", 6, 7, "Patchy:F:<NoInten>:<NoVis>:", "all"),
671           ("Fcst", "Wx", "WEATHER", 7, 12, "NoWx", "all"),
672           ],
673        "checkStrings": [
674           "PATCHY FOG",
675           ],
676        "fileChanges": [
677           ("ZFP_<site>_Overrides", "TextUtility", "add", period1, "undo"),
678           ],
679   
680        },
681        ### Areal Sky 
682        {
683        "name": "arealSky1",
684        "commentary": "Areal sky wording with transition",
685        "productType": "ZFP",
686        "createGrids": [
687           ("Fcst", "PoP", "SCALAR", 0, 12, 0, "all", 1),
688           ("Fcst", "Wx", "WEATHER", 0, 6, "Patchy:F:<NoInten>:<NoVis>:", "all"),
689           ("Fcst", "Wx", "WEATHER", 6, 12, "NoWx", "all"),
690           ("Fcst", "Sky", "SCALAR", 0, 6,  95, "all"),
691           ("Fcst", "Sky", "SCALAR", 6, 12, 0, "all"),
692           ],
693        "checkStrings": [
694           "TODAY",
695           "LOW CLOUDS AND FOG IN THE MORNING THEN CLEARING",
696           "TONIGHT",
697           ],
698        "fileChanges": [
699           ("ZFP_<site>_Definition", "TextUtility", "replace", (arealSkyDef1, arealSkyDef2), "undo"),
700           ("ZFP_<site>_Overrides", "TextUtility", "add", arealSky, "undo"),
701           ],
702        "comboFlag": 1,
703                        
704        },
705        
706        #  We disableSkyRelatedWx when the areal_sky_flag is 1, even IF the
707        #  areal sky wording does not kick in.  Thus, arealSky2 test fails.
708        #  Is this ok or not?
709        {
710        "name": "arealSky2",
711        "commentary": "No Areal sky wording (sky not high enough) so normal wording",
712        "productType": "ZFP",
713        "createGrids": [
714           ("Fcst", "PoP", "SCALAR", 0, 12, 0, "all", 1),
715           ("Fcst", "Wx", "WEATHER", 0, 6, "Patchy:F:<NoInten>:<NoVis>:", "all"),
716           ("Fcst", "Wx", "WEATHER", 6, 12, "NoWx", "all"),
717           ("Fcst", "Sky", "SCALAR", 0, 6,  60, "all"),
718           ("Fcst", "Sky", "SCALAR", 6, 12, 0, "all"),
719           ],
720        "checkStrings": [
721           "TODAY",
722           #"PARTLY CLOUDY IN THE MORNING THEN CLEARING",
723           #"PATCHY FOG IN THE MORNING",
724           "TONIGHT",
725           ],
726        "fileChanges": [
727           ("ZFP_<site>_Definition", "TextUtility", "replace", (arealSkyDef1, arealSkyDef2), "undo"),
728           ("ZFP_<site>_Overrides", "TextUtility", "add", arealSky, "undo"),
729           ],
730        "comboFlag": 1,
731                        
732        },
733   
734        ### Diurnal Sky Period Combining
735        {
736        "name": "diurnalSky1",
737        "commentary": "Diurnal sky wording when period combining -- starting with Day period",
738        "productType": "ZFP",
739        "createGrids": [#TestScript.general_createGrids + [    
740           ("Fcst", "Sky", "SCALAR", 48, 72, 0, "all"),
741           ("Fcst", "Sky", "SCALAR", 72, 78, 100, "all"),
742           ("Fcst", "Sky", "SCALAR", 78, 84, 0, "all"),
743           ("Fcst", "Sky", "SCALAR", 84, 90, 0, "all"),
744           ("Fcst", "Sky", "SCALAR", 90, 96, 100, "all"),
745           ("Fcst", "Sky", "SCALAR", 96, 102, 100, "all"),
746           ("Fcst", "Sky", "SCALAR", 102, 108, 0, "all"),
747           ("Fcst", "Sky", "SCALAR", 108, 114, 0, "all"),
748           ("Fcst", "Sky", "SCALAR", 114, 120, 100, "all"),
749           ("Fcst", "Wx", "WEATHER", 72, 78, "Patchy:F:<NoInten>:<NoVis>:", "all"),
750           ("Fcst", "Wx", "WEATHER", 78, 84, "NoWx", "all"),
751           ("Fcst", "Wx", "WEATHER", 84, 90, "NoWx", "all"),
752           ("Fcst", "Wx", "WEATHER", 90, 96, "Patchy:F:<NoInten>:<NoVis>:", "all"),
753           ("Fcst", "Wx", "WEATHER", 96, 102, "Patchy:F:<NoInten>:<NoVis>:", "all"),
754           ("Fcst", "Wx", "WEATHER", 102, 108, "NoWx", "all"),
755           ("Fcst", "Wx", "WEATHER", 108, 114, "NoWx", "all"),
756           ("Fcst", "Wx", "WEATHER", 114, 120, "Patchy:F:<NoInten>:<NoVis>:", "all"),
757           ("Fcst", "PoP", "SCALAR", 48, 120, 0, "all"),
758    ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+24", "MaxTEnd+24", 70, "all"),
759    ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+24", "MinTEnd+24", 43, "all"),
760    ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+48", "MaxTEnd+48", 70, "all"),
761    ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+48", "MinTEnd+48", 43, "all"),
762    ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+60", "MaxTEnd+60", 70, "all"),
763    ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+60", "MinTEnd+60", 43, "all"),
764    ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+72", "MaxTEnd+72", 70, "all"),
765    ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+72", "MinTEnd+72", 43, "all"),
766    ##       ("Fcst", "Wind", "VECTOR", 36, 72, (10, "SW"), "all"),
767               ],
768        "checkStrings": [
769           "MONDAY THROUGH TUESDAY NIGHT...",
770           "LOW CLOUDS AND FOG IN THE MORNING AND NIGHT...OTHERWISE CLEAR",
771           ],
772        "fileChanges": [
773           ("ZFP_<site>_Definition", "TextUtility", "replace", (arealSkyDef1, arealSkyDef2), "undo"),
774           ("ZFP_<site>_Definition", "TextUtility", "replace",
775           (periodCombine1, periodCombine2), "undo"),
776           ("ZFP_<site>_Overrides", "TextUtility", "add", arealSky, "undo"),
777           ("ZFP_<site>_Overrides", "TextUtility", "add", diurnalSky, "undo"),
778           ],
779        "comboFlag": 1,
780        "gridsStartTime": "6am Local",
781        "drtTime": "6am Local",                    
782        },
783   
784        {
785        "name": "diurnalSky2",
786        "commentary": "Diurnal sky wording when period combining -- starting with Night period",
787        "productType": "ZFP",
788        "createGrids": [#TestScript.general_createGrids + [    
789           ("Fcst", "Sky", "SCALAR", 72, 78, 0, "all"),
790           ("Fcst", "Sky", "SCALAR", 78, 84, 0, "all"),
791           ("Fcst", "Sky", "SCALAR", 84, 90, 0, "all"),
792           ("Fcst", "Sky", "SCALAR", 90, 96, 100, "all"),
793           ("Fcst", "Sky", "SCALAR", 96, 102, 100, "all"),
794           ("Fcst", "Sky", "SCALAR", 102, 108, 0, "all"),
795           ("Fcst", "Sky", "SCALAR", 108, 114, 0, "all"),
796           ("Fcst", "Sky", "SCALAR", 114, 120, 100, "all"),
797           ("Fcst", "Wx", "WEATHER", 72, 78, "Patchy:F:<NoInten>:<NoVis>:", "all"),
798           ("Fcst", "Wx", "WEATHER", 78, 84, "NoWx", "all"),
799           ("Fcst", "Wx", "WEATHER", 84, 90, "NoWx", "all"),
800           ("Fcst", "Wx", "WEATHER", 90, 96, "Patchy:F:<NoInten>:<NoVis>:", "all"),
801           ("Fcst", "Wx", "WEATHER", 96, 102, "Patchy:F:<NoInten>:<NoVis>:", "all"),
802           ("Fcst", "Wx", "WEATHER", 102, 108, "NoWx", "all"),
803           ("Fcst", "Wx", "WEATHER", 108, 114, "NoWx", "all"),
804           ("Fcst", "Wx", "WEATHER", 114, 120, "Patchy:F:<NoInten>:<NoVis>:", "all"),
805           ("Fcst", "PoP", "SCALAR", 48, 120, 0, "all"),
806    ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+24", "MaxTEnd+24", 70, "all"),
807    ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+24", "MinTEnd+24", 43, "all"),
808    ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+48", "MaxTEnd+48", 70, "all"),
809    ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+48", "MinTEnd+48", 43, "all"),
810    ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+60", "MaxTEnd+60", 70, "all"),
811    ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+60", "MinTEnd+60", 43, "all"),
812    ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+72", "MaxTEnd+72", 70, "all"),
813    ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+72", "MinTEnd+72", 43, "all"),
814    ##       ("Fcst", "Wind", "VECTOR", 36, 72, (10, "SW"), "all"),
815               ],
816        "checkStrings": [
817           "MONDAY NIGHT THROUGH TUESDAY NIGHT...",
818           "LOW CLOUDS AND FOG IN THE NIGHT AND MORNING...OTHERWISE CLEAR",
819           ],
820        "fileChanges": [
821           ("ZFP_<site>_Definition", "TextUtility", "replace", (arealSkyDef1, arealSkyDef2), "undo"),
822           ("ZFP_<site>_Definition", "TextUtility", "replace",
823           (periodCombine1, periodCombine2), "undo"),
824           ("ZFP_<site>_Overrides", "TextUtility", "add", arealSky, "undo"),
825           ("ZFP_<site>_Overrides", "TextUtility", "add", diurnalSky, "undo"),
826           ],
827        "comboFlag": 1,
828        "gridsStartTime": "6am Local",
829        "drtTime": "6am Local",                    
830        },
831   
832        ### Increasing/decreasing threshold TK 4112
833        {
834        "name": "IncreasingSky1",
835        "commentary": "Increasing sky wording",
836        "productType": "ZFP",
837        "createGrids": [#TestScript.general_createGrids + [    
838           ("Fcst", "Sky", "SCALAR", 48, 54, 5, "all"),
839           ("Fcst", "Sky", "SCALAR", 54, 60, 55, "all"),
840           ("Fcst", "Sky", "SCALAR", 60, 66, 5, "all"),
841           ("Fcst", "Sky", "SCALAR", 66, 72, 55, "all"),
842           ],
843        "checkStrings": [
844           ".SUNDAY...", "INCREASING CLOUDS",
845           ".SUNDAY NIGHT...", "INCREASING CLOUDS",
846           ],
847        "fileChanges": [
848               ("ZFP_<site>_Overrides", "TextUtility", "add", increaseSky1, "undo"),
849               ],
850        "comboFlag": 1,
851        "gridsStartTime": "6am Local",
852        "drtTime": "6am Local",                    
853        },
854   
855        {
856        "name": "IncreasingSky2",
857        "commentary": "Increasing sky wording",
858        "productType": "ZFP",
859        "createGrids": [#TestScript.general_createGrids + [    
860           ("Fcst", "Sky", "SCALAR", 48, 54, 5, "all"),
861           ("Fcst", "Sky", "SCALAR", 54, 60, 55, "all"),
862           ("Fcst", "Sky", "SCALAR", 60, 66, 5, "all"),
863           ("Fcst", "Sky", "SCALAR", 66, 72, 55, "all"),
864           ],
865        "checkStrings": [
866           ".SUNDAY...", "INCREASING CLOUDS",
867           ".SUNDAY NIGHT...","CLEAR IN THE EVENING THEN BECOMING MOSTLY CLOUDY",
868           ],
869        "fileChanges": [
870               ("ZFP_<site>_Overrides", "TextUtility", "add", increaseSky2, "undo"),
871               ],
872        "comboFlag": 1,
873        "gridsStartTime": "6am Local",
874        "drtTime": "6am Local",                    
875        },
876   
877   
878        ### Local Headline Timing : Tests DiscretePhrases headlinesTiming and
879        ###    headlinesTimeRange_descriptor
880        ### TK 4259
881        {
882        "name": "HeadlineTiming1",
883        "commentary": "startPhraseType=DAY_NIGHT_ONLY, endPhraseType=DAY_NIGHT_ONLY",
884        "productType": "ZFP",
885        "createGrids": [
886           ("Fcst", "Hazards", "DISCRETE", 0, 60, "<None>", "all"),
887           ("Fcst", "Hazards", "DISCRETE", 2, 11, "LocalHazard1", "all"),
888           ("Fcst", "Hazards", "DISCRETE", 15, 20, "LocalHazard1", "all"),
889           ("Fcst", "Hazards", "DISCRETE", 28, 29, "LocalHazard1", "all"),
890           ("Fcst", "Hazards", "DISCRETE", 40, 41, "LocalHazard1", "all"),
891           ("Fcst", "Hazards", "DISCRETE", 59, 60, "LocalHazard1", "all"),
892           ("Fcst", "Hazards", "DISCRETE", 79, 71, "LocalHazard1", "all"),
893          ],
894        "checkStrings": [
895           "...LOCAL HAZARD TODAY...",
896           "...LOCAL HAZARD TONIGHT...",
897           "...LOCAL HAZARD SATURDAY...",
898           "...LOCAL HAZARD SATURDAY NIGHT...",
899           "...LOCAL HAZARD SUNDAY...",
900           "...LOCAL HAZARD FROM SUNDAY NIGHT THROUGH MONDAY...",
901           ],
902        "fileChanges": [
903           ("ZFP_<site>_Overrides", "TextUtility", "add", headlinesTiming, "undo"),
904           ("ZFP_<site>_Overrides", "TextUtility", "add", headlinesTiming1, "undo"),
905           ],
906        "comboFlag": 1,
907        "gridsStartTime": "6am Local",
908        "drtTime": "4am Local",
909        },
910        {
911        "name": "HeadlineTiming2",
912        "commentary": "startPhraseType=FUZZY, endPhraseType=FUZZY, startBoundary=3",
913        "productType": "ZFP",
914        "createGrids": [
915           ("Fcst", "Hazards", "DISCRETE", 0, 60, "<None>", "all"),
916           ("Fcst", "Hazards", "DISCRETE", 2, 11, "LocalHazard1", "all"),
917           ("Fcst", "Hazards", "DISCRETE", 15, 20, "LocalHazard1", "all"),
918           ("Fcst", "Hazards", "DISCRETE", 28, 29, "LocalHazard1", "all"),
919           ("Fcst", "Hazards", "DISCRETE", 40, 41, "LocalHazard1", "all"),
920           ("Fcst", "Hazards", "DISCRETE", 59, 60, "LocalHazard1", "all"),
921           ("Fcst", "Hazards", "DISCRETE", 79, 71, "LocalHazard1", "all"),
922          ],
923        "checkStrings": [
924           "...LOCAL HAZARD FROM THIS MORNING THROUGH THIS AFTERNOON...",
925           "...LOCAL HAZARD FROM THIS EVENING THROUGH LATE TONIGHT...",
926           "...LOCAL HAZARD SATURDAY MORNING...",
927           "...LOCAL HAZARD SATURDAY EVENING...",
928           "...LOCAL HAZARD SUNDAY AFTERNOON...",
929           "...LOCAL HAZARD FROM LATE SUNDAY NIGHT THROUGH MONDAY AFTERNOON...",
930           ],
931        "fileChanges": [
932           ("ZFP_<site>_Overrides", "TextUtility", "add", headlinesTiming, "undo"),
933           ("ZFP_<site>_Overrides", "TextUtility", "add", headlinesTiming2, "undo"),
934           ],
935        "comboFlag": 1,
936        "gridsStartTime": "6am Local",
937        "drtTime": "4am Local",
938        },
939        {
940        "name": "HeadlineTiming3",
941        "commentary": "startPhraseType=EXPLICIT, endPhraseType=FUZZY, startBoundary=3",
942        "productType": "ZFP",
943        "createGrids": [
944           ("Fcst", "Hazards", "DISCRETE", 0, 60, "<None>", "all"),
945           ("Fcst", "Hazards", "DISCRETE", 2, 11, "LocalHazard1", "all"),
946           ("Fcst", "Hazards", "DISCRETE", 15, 20, "LocalHazard1", "all"),
947           ("Fcst", "Hazards", "DISCRETE", 28, 29, "LocalHazard1", "all"),
948           ("Fcst", "Hazards", "DISCRETE", 40, 41, "LocalHazard1", "all"),
949           ("Fcst", "Hazards", "DISCRETE", 59, 60, "LocalHazard1", "all"),
950           ("Fcst", "Hazards", "DISCRETE", 79, 71, "LocalHazard1", "all"),
951          ],
952        "checkStrings": [
953           "...LOCAL HAZARD FROM 8 AM EST THIS MORNING THROUGH THIS AFTERNOON...",
954           "...LOCAL HAZARD FROM 9 PM EST THIS EVENING THROUGH LATE TONIGHT..",
955           "...LOCAL HAZARD FROM 10 AM EST SATURDAY THROUGH SATURDAY MORNING...",
956           "...LOCAL HAZARD FROM 10 PM EST SATURDAY THROUGH SATURDAY EVENING...",
957           "...LOCAL HAZARD FROM 5 PM EST SUNDAY THROUGH SUNDAY AFTERNOON...",
958           "...LOCAL HAZARD FROM 5 AM EST MONDAY THROUGH MONDAY AFTERNOON...",
959           ],
960        "fileChanges": [
961           ("ZFP_<site>_Overrides", "TextUtility", "add", headlinesTiming, "undo"),
962           ("ZFP_<site>_Overrides", "TextUtility", "add", headlinesTiming3, "undo"),
963           ],
964        "comboFlag": 1,
965        "gridsStartTime": "6am Local",
966        "drtTime": "4am Local",
967        },
968        {
969        "name": "HeadlineTiming4",
970        "commentary": "startPhraseType=EXPLICIT, endPhraseType=EXPLICIT, startBoundary=3",
971        "productType": "ZFP",
972        "createGrids": [
973           ("Fcst", "Hazards", "DISCRETE", 0, 60, "<None>", "all"),
974           ("Fcst", "Hazards", "DISCRETE", 2, 11, "LocalHazard1", "all"),
975           ("Fcst", "Hazards", "DISCRETE", 15, 20, "LocalHazard1", "all"),
976           ("Fcst", "Hazards", "DISCRETE", 28, 29, "LocalHazard1", "all"),
977           ("Fcst", "Hazards", "DISCRETE", 40, 41, "LocalHazard1", "all"),
978           ("Fcst", "Hazards", "DISCRETE", 59, 60, "LocalHazard1", "all"),
979           ("Fcst", "Hazards", "DISCRETE", 79, 71, "LocalHazard1", "all"),
980          ],
981        "checkStrings": [
982           "...LOCAL HAZARD FROM 8 AM THIS MORNING TO 5 PM EST THIS AFTERNOON...",
983           "...LOCAL HAZARD FROM 9 PM THIS EVENING TO 2 AM EST SATURDAY...",
984           "...LOCAL HAZARD FROM 10 AM TO 11 AM EST SATURDAY...",
985           "...LOCAL HAZARD FROM 10 PM TO 11 PM EST SATURDAY...",
986           "...LOCAL HAZARD FROM 5 PM TO 6 PM EST SUNDAY...",
987           "...LOCAL HAZARD FROM 5 AM TO 1 PM EST MONDAY...",
988           ],
989        "fileChanges": [
990           ("ZFP_<site>_Overrides", "TextUtility", "add", headlinesTiming, "undo"),
991           ("ZFP_<site>_Overrides", "TextUtility", "add", headlinesTiming4, "undo"),
992           ],
993        "comboFlag": 1,
994        "gridsStartTime": "6am Local",
995        "drtTime": "4am Local",
996        },
997        ### Local Headlines mixed with VTEC
998        {
999        "name": "LocalHeadlines1",
1000       "commentary": "Local Headlines mixed with VTEC",
1001       "productType": "ZFP",
1002       "createGrids": [
1003          ("Fcst", "Hazards", "DISCRETE", 0, 60, "<None>", "all"),
1004          ("Fcst", "Hazards", "DISCRETE", 2, 11, "LocalHazard1", "all"),
1005          ("Fcst", "Hazards", "DISCRETE", 7, 9,  "LocalHazard1^WS.W", "all"),
1006         ],
1007       "orderStrings": 1,
1008       "checkStrings": [
1009          "LOCAL HAZARD IN EFFECT UNTIL 5 PM EST THIS AFTERNOON",
1010          "WINTER STORM WARNING IN EFFECT FROM 1 PM TO 3 PM EST THIS AFTERNOON",
1011          ],
1012       "fileChanges": [
1013          ("ZFP_<site>_Overrides", "TextUtility", "add", localHeadlines1, "undo"),
1014          ],
1015       "comboFlag": 1,
1016       "gridsStartTime": "6am Local",
1017       "drtTime": "4am Local",
1018       },
1019  
1020       {
1021       "commentary": "Clear out all Hazards Grids.",
1022       "name": "Headlines_Cleanup",
1023       "productType": None,
1024       "deleteGrids": [
1025          ("Fcst", "Hazards", "SFC", "all", "all"),
1026          ],
1027       },
1028  
1029       ### Null always distinct  TK 4264
1030       {
1031       "name": "NullDistinct1",
1032       "commentary": "Null Distinct from Non-Null",
1033       "productType": "Phrase_Test_Local",
1034       "createGrids": [
1035          ("Fcst", "Wind", "VECTOR", 0, 6,  (2,"N"), "all"),
1036          ("Fcst", "WindGust", "SCALAR", 0, 6,  0, "all"),
1037          ("Fcst", "Wind", "VECTOR", 6, 12,  (5,"N"), "all"),
1038          ("Fcst", "WindGust", "SCALAR", 6, 12,  0, "all"),
1039          ],
1040       "checkStrings": [
1041          "LIGHT WINDS BECOMING NORTH AROUND 5 MPH IN THE AFTERNOON",
1042          ],
1043       },
1044       {
1045       "name": "NullDistinct2",
1046       "commentary": "Null Not Distinct from Non-Null",
1047       "productType": "Phrase_Test_Local",
1048       "createGrids": [
1049          ("Fcst", "Wind", "VECTOR", 0, 6,  (2,"N"), "all"),
1050          ("Fcst", "WindGust", "SCALAR", 0, 6,  0, "all"),
1051          ("Fcst", "Wind", "VECTOR", 6, 12,  (5,"N"), "all"),
1052          ("Fcst", "WindGust", "SCALAR", 6, 12,  0, "all"),
1053          ],
1054       "checkStrings": [
1055          "NORTH WINDS UP TO 5 MPH",
1056          ],
1057       "fileChanges": [
1058          ("Phrase_Test_Local", "TextProduct", "add", null_distinct, "undo"),
1059          ],
1060       },
1061  
1062       ### Null always distinct  TK 4264
1063       {
1064       "name": "NullDistinct1",
1065       "commentary": "Null Distinct from Non-Null",
1066       "productType": "Phrase_Test_Local",
1067       "createGrids": [
1068          ("Fcst", "Wind", "VECTOR", 0, 6,  (2,"N"), "all"),
1069          ("Fcst", "WindGust", "SCALAR", 0, 6,  0, "all"),
1070          ("Fcst", "Wind", "VECTOR", 6, 12,  (5,"N"), "all"),
1071          ("Fcst", "WindGust", "SCALAR", 6, 12,  0, "all"),
1072          ],
1073       "checkStrings": [
1074          "LIGHT WINDS BECOMING NORTH AROUND 5 MPH IN THE AFTERNOON",
1075          ],
1076       },
1077       {
1078       "name": "NullDistinct2",
1079       "commentary": "Null Not Distinct from Non-Null",
1080       "productType": "Phrase_Test_Local",
1081       "createGrids": [
1082          ("Fcst", "Wind", "VECTOR", 0, 6,  (2,"N"), "all"),
1083          ("Fcst", "WindGust", "SCALAR", 0, 6,  0, "all"),
1084          ("Fcst", "Wind", "VECTOR", 6, 12,  (5,"N"), "all"),
1085          ("Fcst", "WindGust", "SCALAR", 6, 12,  0, "all"),
1086          ],
1087       "checkStrings": [
1088          "NORTH WINDS UP TO 5 MPH",
1089          ],
1090       "fileChanges": [
1091          ("Phrase_Test_Local", "TextProduct", "add", null_distinct, "undo"),
1092          ],
1093       },
1094       ### Null always distinct  TK 4264
1095       {
1096       "name": "NullDistinct1",
1097       "commentary": "Null Distinct from Non-Null",
1098       "productType": "Phrase_Test_Local",
1099       "createGrids": [
1100          ("Fcst", "Wind", "VECTOR", 0, 6,  (2,"N"), "all"),
1101          ("Fcst", "WindGust", "SCALAR", 0, 6,  0, "all"),
1102          ("Fcst", "Wind", "VECTOR", 6, 12,  (5,"N"), "all"),
1103          ("Fcst", "WindGust", "SCALAR", 6, 12,  0, "all"),
1104          ],
1105       "checkStrings": [
1106          "LIGHT WINDS BECOMING NORTH AROUND 5 MPH IN THE AFTERNOON",
1107          ],
1108       },
1109  
1110       ##### MaxMode and Mixed Wx  (Dave Metze)  Tk 4450
1111       {
1112       "name": "MaxMode_and_MixedWx",
1113       "commentary": "Using MaxMode for PoP with T plus K",
1114       "productType": "Phrase_Test_Local",
1115       "createGrids": [
1116          ("Fcst", "Sky", "SCALAR", 0, 6,  20, "all", 1),
1117          ("Fcst", "Sky", "SCALAR", 6, 12, 87, "all", 1),
1118          ("Fcst", "PoP", "SCALAR", 0, 6,   0, "all", 1),
1119          ("Fcst", "PoP", "SCALAR", 6, 9,   5, "all", 1),
1120          ("Fcst", "PoP", "SCALAR", 9, 12,  20, "all", 1),
1121          ("Fcst", "Wx", "WEATHER", 0, 6, "Areas:K:<NoInten>:<NoVis>:", "all"),
1122          ("Fcst", "Wx", "WEATHER", 6, 12,
1123          "SChc:T:<NoInten>:<NoVis>:^Areas:K:<NoInten>:<NoVis>:", "all"),
1124          ],
1125       "checkStrings": [
1126          "MOSTLY SUNNY UNTIL LATE AFTERNOON...THEN MOSTLY CLOUDY WITH A 20 PERCENT CHANCE OF THUNDERSTORMS LATE IN THE AFTERNOON",
1127          "AREAS OF SMOKE THROUGH THE DAY",
1128          ],
1129       "fileChanges": [
1130          ("Phrase_Test_Local", "TextProduct", "replace",
1131          ('"PoP": (5, "Max", None),', '"PoP": (5, "MaxMode", None),'), "undo"),
1132          ],
1133       },
1134       
1135       {
1136       "name": "MaxMode_Only",
1137       "commentary": "Using MaxMode for PoP with T",
1138       "productType": "Phrase_Test_Local",
1139       "createGrids": [
1140          ("Fcst", "Sky", "SCALAR", 0, 6,  20, "all", 1),
1141          ("Fcst", "Sky", "SCALAR", 6, 12, 60, "all", 1),
1142          ("Fcst", "PoP", "SCALAR", 0, 6,   0, "all", 1),
1143          ("Fcst", "PoP", "SCALAR", 6, 9,   5, "all", 1),
1144          ("Fcst", "PoP", "SCALAR", 9, 12,  20, "all", 1),
1145          ("Fcst", "Wx", "WEATHER", 0, 6, "NoWx", "all"),
1146          ("Fcst", "Wx", "WEATHER", 6, 12, "SChc:T:<NoInten>:<NoVis>:", "all"),
1147          ],
1148       "checkStrings": [
1149          "MOSTLY SUNNY UNTIL LATE AFTERNOON...THEN A 20 PERCENT CHANCE OF THUNDERSTORMS LATE IN THE AFTERNOON",
1150          ],
1151       "fileChanges": [
1152          ("Phrase_Test_Local", "TextProduct", "replace",
1153          ('"PoP": (5, "Max", None),', '"PoP": (5, "MaxMode", None),'), "undo"),
1154          ],
1155       },
1156  
1157       # TK 4676  PoP temporal coverage changed to zero
1158       {
1159       "name": "PoP_TemporalCoverage1",
1160       "commentary": "tk4676 PoP temporal coverage changed to zero",
1161       "productType": "Phrase_Test_Local",
1162       "createGrids": [
1163          ("Fcst", "PoP", "SCALAR", -3, 1, 70, "all", 1),
1164          ("Fcst", "PoP", "SCALAR", 1, 12, 60, "all", 1),
1165          ("Fcst", "Sky", "SCALAR", 0, 12, 50, "all", 1),
1166          ("Fcst", "Wx", "WEATHER", 0, 12, "Lkly:T:<NoInten>:<NoVis>:", "all"),
1167          ],
1168       "checkStrings": [
1169          "THUNDERSTORMS LIKELY",
1170          "CHANCE OF THUNDERSTORMS 60 PERCENT",
1171          ],
1172       "fileChanges": [
1173          ("Phrase_Test_Local", "TextProduct", "replace",
1174              ('("PoP", self.binnedPercent, [3])', '("PoP", self.binnedPercent, [12])'),
1175              "undo"),
1176          ("Phrase_Test_Local", "TextProduct", "add", tempCov, "undo"),
1177          ],
1178       },
1179       # TK 4676  PoP temporal coverage changed to zero
1180       {
1181       "name": "PoP_TemporalCoverage2",
1182       "commentary": "tk4676 PoP temporal coverage changed to zero",
1183       "productType": "Phrase_Test_Local",
1184       "createGrids": [
1185          ("Fcst", "PoP", "SCALAR", -3, 1, 70, "all", 1),
1186          ("Fcst", "PoP", "SCALAR", 1, 12, 60, "all", 1),
1187          ("Fcst", "Sky", "SCALAR", 0, 12, 50, "all", 1),
1188          ("Fcst", "Wx", "WEATHER", 0, 12, "Lkly:T:<NoInten>:<NoVis>:", "all"),
1189          ],
1190       "checkStrings": [
1191          "THUNDERSTORMS LIKELY",
1192          "CHANCE OF THUNDERSTORMS 70 PERCENT",
1193          ],
1194       "fileChanges": [
1195          ("Phrase_Test_Local", "TextProduct", "replace",
1196              ('("PoP", self.binnedPercent, [3])', '("PoP", self.binnedPercent, [12])'),
1197              "undo"),
1198          ],           
1199       },
1200  
1201  
1202        ### CWF Swell Phrase -- no secondary elements TK 4277
1203       {
1204       "name": "CWF_Swell1",
1205       "commentary": "CWF Swell phrase: Neither null",
1206       "productType": "CWF",
1207       "createGrids": [
1208          ("Fcst", "Swell", "VECTOR", 0, 12,  (7,"N"), "all"),
1209          ("Fcst", "Swell2", "VECTOR", 0, 12,  (14,"E"), "all"),
1210          ],
1211       "checkStrings": [
1212          "MIXED SWELL NORTH AROUND 7 FEET AND EAST AROUND 14 FEET",
1213          ],
1214       "comboFlag": 1,
1215       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1216       "gridsStartTime": "6am Local",
1217       "drtTime": "4am Local",
1218       "fileChanges":[
1219          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1220          ],
1221       },    
1222       {
1223       "name": "CWF_Swell2",
1224       "commentary": "CWF Swell phrase: Swell2 Null",
1225       "productType": "CWF",
1226       "createGrids": [
1227          ("Fcst", "Swell", "VECTOR", 0, 12,  (7,"N"), "all"),
1228          ("Fcst", "Swell2", "VECTOR", 0, 12,  (0,"E"), "all"),
1229          ],
1230       "checkStrings": [
1231          "NORTH SWELL AROUND 7 FEET",
1232          ],
1233       "comboFlag": 1,                    
1234       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1235       "gridsStartTime": "6am Local",
1236       "drtTime": "4am Local",
1237       "fileChanges":[
1238          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1239          ],
1240       },    
1241       {
1242       "name": "CWF_Swell3",
1243       "commentary": "CWF Swell phrase: Swell Null",
1244       "productType": "CWF",
1245       "createGrids": [
1246          ("Fcst", "Swell", "VECTOR", 0, 12,  (0,"N"), "all"),
1247          ("Fcst", "Swell2", "VECTOR", 0, 12,  (14,"E"), "all"),
1248          ],
1249       "checkStrings": [
1250          "SWELL EAST AROUND 14 FEET",
1251          ],
1252       "comboFlag": 1,                    
1253       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1254       "gridsStartTime": "6am Local",
1255       "drtTime": "4am Local",
1256       "fileChanges":[
1257          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1258          ],
1259       },    
1260       {
1261       "name": "CWF_Swell4",
1262       "commentary": "CWF Swell phrase: 2 sub-phrases, neither null",
1263       "productType": "CWF",
1264       "createGrids": [
1265          ("Fcst", "Swell", "VECTOR", 0, 6,  (7,"N"), "all"),
1266          ("Fcst", "Swell2", "VECTOR", 0, 6,  (12,"E"), "all"),
1267          ("Fcst", "Swell", "VECTOR", 6, 14,  (14,"NW"), "all"),
1268          ("Fcst", "Swell2", "VECTOR", 6, 14,  (7,"SE"), "all"),
1269          ],
1270       "checkStrings": [
1271          "MIXED SWELL NORTH AROUND 7 FEET AND EAST AROUND 12 FEET INCREASING TO NORTHWEST AROUND 14 FEET AND SOUTHEAST AROUND 7 FEET IN THE AFTERNOON",
1272          ],
1273       "comboFlag": 1,                    
1274       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1275       "gridsStartTime": "6am Local",
1276       "drtTime": "4am Local",
1277       "fileChanges":[
1278          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1279          ],
1280       },    
1281          
1282       {
1283       "name": "CWF_Swell5",
1284       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell2 null in both",
1285       "productType": "CWF",
1286       "createGrids": [
1287          ("Fcst", "Swell", "VECTOR", 0, 6,  (7,"N"), "all"),
1288          ("Fcst", "Swell2", "VECTOR", 0, 6,  (0,"E"), "all"),
1289          ("Fcst", "Swell", "VECTOR", 6, 12,  (14,"NW"), "all"),
1290          ("Fcst", "Swell2", "VECTOR", 6, 12,  (0,"SE"), "all"),
1291          ],
1292       "checkStrings": [
1293          "NORTH SWELL AROUND 7 FEET INCREASING TO NORTHWEST AROUND 14 FEET IN THE AFTERNOON",
1294          ],
1295       "comboFlag": 1,                    
1296       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1297       "gridsStartTime": "6am Local",
1298       "drtTime": "4am Local",
1299       "fileChanges":[
1300          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1301          ],
1302       },    
1303       {
1304       "name": "CWF_Swell6",
1305       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell and Swell2 null in both",
1306       "productType": "CWF",
1307       "createGrids": [
1308          ("Fcst", "Swell", "VECTOR", 0, 6,  (0,"N"), "all"),
1309          ("Fcst", "Swell2", "VECTOR", 0, 6,  (0,"E"), "all"),
1310          ("Fcst", "Swell", "VECTOR", 6, 12,  (0,"NW"), "all"),
1311          ("Fcst", "Swell2", "VECTOR", 6, 12,  (0,"SE"), "all"),
1312          ],
1313       "checkStrings": [
1314          "",
1315          ],
1316       "comboFlag": 1,                    
1317       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1318       "gridsStartTime": "6am Local",
1319       "drtTime": "4am Local",
1320       "fileChanges":[
1321          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1322          ],
1323       },    
1324       {
1325       "name": "CWF_Swell7",
1326       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell null in both -- Combines",
1327       "productType": "CWF",
1328       "createGrids": [
1329          ("Fcst", "Swell", "VECTOR", 0, 6,  (0,"N"), "all"),
1330          ("Fcst", "Swell2", "VECTOR", 0, 6,  (14,"N"), "all"),
1331          ("Fcst", "Swell", "VECTOR", 6, 12,  (0,"NW"), "all"),
1332          ("Fcst", "Swell2", "VECTOR", 6, 12,  (7,"SE"), "all"),
1333          ],
1334       "checkStrings": [
1335          "SWELL SOUTHEAST 8 TO 13 FEET",
1336          ],
1337       "comboFlag": 1,                    
1338       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1339       "gridsStartTime": "6am Local",
1340       "drtTime": "4am Local",
1341       "fileChanges":[
1342          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1343          ],
1344       },    
1345       {
1346       "name": "CWF_Swell8",
1347       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell2 null in first",
1348       "productType": "CWF",
1349       "createGrids": [
1350          ("Fcst", "Swell", "VECTOR", 0, 6,  (7,"N"), "all"),
1351          ("Fcst", "Swell2", "VECTOR", 0, 6,  (0,"E"), "all"),
1352          ("Fcst", "Swell", "VECTOR", 6, 12,  (14,"NW"), "all"),
1353          ("Fcst", "Swell2", "VECTOR", 6, 12,  (7,"SE"), "all"),
1354          ],
1355       "checkStrings": [
1356          "NORTH SWELL AROUND 7 FEET INCREASING TO NORTHWEST AROUND 14 FEET AND SOUTHEAST AROUND 7 FEET IN THE AFTERNOON",
1357          ],
1358       "comboFlag": 1,                    
1359       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1360       "gridsStartTime": "6am Local",
1361       "drtTime": "4am Local",
1362       "fileChanges":[
1363          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1364          ],
1365       },    
1366       {
1367       "name": "CWF_Swell9",
1368       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell null in first",
1369       "productType": "CWF",
1370       "createGrids": [
1371          ("Fcst", "Swell", "VECTOR", 0, 6,  (0,"N"), "all"),
1372          ("Fcst", "Swell2", "VECTOR", 0, 6,  (14,"E"), "all"),
1373          ("Fcst", "Swell", "VECTOR", 6, 12,  (14,"NW"), "all"),
1374          ("Fcst", "Swell2", "VECTOR", 6, 12,  (7,"SE"), "all"),
1375          ],
1376       "checkStrings": [
1377          "SWELL EAST AROUND 14 FEET INCREASING TO NORTHWEST AROUND 14 FEET AND SOUTHEAST AROUND 7 FEET IN THE AFTERNOON",
1378          ],
1379       "comboFlag": 1,                    
1380       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1381       "gridsStartTime": "6am Local",
1382       "drtTime": "4am Local",
1383       "fileChanges":[
1384          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1385          ],
1386       },
1387       {
1388       "name": "CWF_Swell10",
1389       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell same mag, Swell2 null in both",
1390       "productType": "CWF",
1391       "createGrids": [
1392          ("Fcst", "Swell", "VECTOR", 0, 6,  (7,"N"), "all"),
1393          ("Fcst", "Swell2", "VECTOR", 0, 6,  (0,"E"), "all"),
1394          ("Fcst", "Swell", "VECTOR", 6, 12,  (10,"NW"), "all"),
1395          ("Fcst", "Swell2", "VECTOR", 6, 12,  (0,"SE"), "all"),
1396          ],
1397       "checkStrings": [
1398          "NORTHWEST SWELL 7 TO 10 FEET",
1399          ],
1400       "comboFlag": 1,                    
1401       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1402       "gridsStartTime": "6am Local",
1403       "drtTime": "4am Local",
1404       "fileChanges":[
1405          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1406          ],
1407       },    
1408       {
1409       "name": "CWF_Swell11",
1410       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell null in both, Swell2 same mag",
1411       "productType": "CWF",
1412       "createGrids": [
1413          ("Fcst", "Swell", "VECTOR", 0, 6,  (0,"N"), "all"),
1414          ("Fcst", "Swell2", "VECTOR", 0, 6,  (10,"E"), "all"),
1415          ("Fcst", "Swell", "VECTOR", 6, 12,  (0,"NW"), "all"),
1416          ("Fcst", "Swell2", "VECTOR", 6, 12,  (7,"SE"), "all"),
1417          ],
1418       "checkStrings": [
1419          "SWELL SOUTHEAST 7 TO 10 FEET",
1420          ],
1421       "comboFlag": 1,                    
1422       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1423       "gridsStartTime": "6am Local",
1424       "drtTime": "4am Local",
1425       "fileChanges":[
1426          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1427          ],
1428       },
1429  
1430       ### CWF_Swell_withPeriod
1431       {
1432       "name": "CWF_Swell_withPeriod1",
1433       "commentary": "CWF Swell phrase: Neither null",
1434       "productType": "CWF",
1435       "createGrids": [
1436          ("Fcst", "Swell", "VECTOR", 0, 12,  (7,"N"), "all"),
1437          ("Fcst", "Swell2", "VECTOR", 0, 12,  (14,"E"), "all"),
1438          ("Fcst", "Period", "SCALAR", 0, 12, 5, "all"),
1439          ("Fcst", "Period2", "SCALAR", 0, 12, 10, "all"),
1440          ],
1441       "checkStrings": [
1442          "MIXED SWELL NORTH AROUND 7 FEET AT 5 SECONDS AND EAST AROUND 14 FEET AT 10 SECONDS",
1443          ],
1444       "comboFlag": 1,
1445       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1446       "gridsStartTime": "6am Local",
1447       "drtTime": "4am Local",
1448       },    
1449       {
1450       "name": "CWF_Swell_withPeriod2",
1451       "commentary": "CWF Swell phrase: Swell2 Null",
1452       "productType": "CWF",
1453       "createGrids": [
1454          ("Fcst", "Swell", "VECTOR", 0, 12,  (7,"N"), "all"),
1455          ("Fcst", "Swell2", "VECTOR", 0, 12,  (0,"E"), "all"),
1456          ("Fcst", "Period", "SCALAR", 0, 12, 5, "all"),
1457          ("Fcst", "Period2", "SCALAR", 0, 12, 10, "all"),
1458          ],
1459       "checkStrings": [
1460          "NORTH SWELL AROUND 7 FEET AT 5 SECONDS",
1461          ],
1462       "comboFlag": 1,                    
1463       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1464       "gridsStartTime": "6am Local",
1465       "drtTime": "4am Local",
1466       },    
1467       {
1468       "name": "CWF_Swell_withPeriod3",
1469       "commentary": "CWF Swell phrase: Swell Null",
1470       "productType": "CWF",
1471       "createGrids": [
1472          ("Fcst", "Swell", "VECTOR", 0, 12,  (0,"N"), "all"),
1473          ("Fcst", "Swell2", "VECTOR", 0, 12,  (14,"E"), "all"),
1474          ("Fcst", "Period", "SCALAR", 0, 12, 5, "all"),
1475          ("Fcst", "Period2", "SCALAR", 0, 12, 10, "all"),
1476          ],
1477       "checkStrings": [
1478          "SWELL EAST AROUND 14 FEET AT 10 SECONDS",
1479          ],
1480       "comboFlag": 1,                    
1481       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1482       "gridsStartTime": "6am Local",
1483       "drtTime": "4am Local",
1484       },    
1485       {
1486       "name": "CWF_Swell_withPeriod4",
1487       "commentary": "CWF Swell phrase: 2 sub-phrases, neither null",
1488       "productType": "CWF",
1489       "createGrids": [
1490          ("Fcst", "Swell", "VECTOR", 0, 6,  (7,"N"), "all"),
1491          ("Fcst", "Swell2", "VECTOR", 0, 6,  (12,"E"), "all"),
1492          ("Fcst", "Period", "SCALAR", 0, 6, 5, "all"),
1493          ("Fcst", "Period2", "SCALAR", 0, 6, 10, "all"),
1494          ("Fcst", "Swell", "VECTOR", 6, 14,  (14,"NW"), "all"),
1495          ("Fcst", "Swell2", "VECTOR", 6, 14,  (7,"SE"), "all"),
1496          ("Fcst", "Period", "SCALAR", 6, 14, 5, "all"),
1497          ("Fcst", "Period2", "SCALAR", 6, 14, 10, "all"),
1498          ],
1499       "checkStrings": [
1500          "MIXED SWELL NORTH AROUND 7 FEET AT 5 SECONDS AND EAST AROUND 12 FEET AT 10 SECONDS INCREASING TO NORTHWEST AROUND 14 FEET AT 5 SECONDS AND SOUTHEAST AROUND 7 FEET AT 10 SECONDS IN THE AFTERNOON",
1501          ],
1502       "comboFlag": 1,                    
1503       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1504       "gridsStartTime": "6am Local",
1505       "drtTime": "4am Local",
1506       },    
1507          
1508       {
1509       "name": "CWF_Swell_withPeriod5",
1510       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell2 null in both",
1511       "productType": "CWF",
1512       "createGrids": [
1513          ("Fcst", "Swell", "VECTOR", 0, 6,  (7,"N"), "all"),
1514          ("Fcst", "Swell2", "VECTOR", 0, 6,  (0,"E"), "all"),
1515          ("Fcst", "Period", "SCALAR", 0, 6, 5, "all"),
1516          ("Fcst", "Period2", "SCALAR", 0, 6, 10, "all"),
1517          ("Fcst", "Swell", "VECTOR", 6, 12,  (14,"NW"), "all"),
1518          ("Fcst", "Swell2", "VECTOR", 6, 12,  (0,"SE"), "all"),
1519          ("Fcst", "Period", "SCALAR", 6, 12, 5, "all"),
1520          ("Fcst", "Period2", "SCALAR", 6, 12, 10, "all"),
1521          ],
1522       "checkStrings": [
1523          "NORTH SWELL AROUND 7 FEET AT 5 SECONDS INCREASING TO NORTHWEST AROUND 14 FEET AT 5 SECONDS IN THE AFTERNOON",
1524          ],
1525       "comboFlag": 1,                    
1526       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1527       "gridsStartTime": "6am Local",
1528       "drtTime": "4am Local",
1529       },    
1530       {
1531       "name": "CWF_Swell_withPeriod6",
1532       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell and Swell2 null in both",
1533       "productType": "CWF",
1534       "createGrids": [
1535          ("Fcst", "Swell", "VECTOR", 0, 6,  (0,"N"), "all"),
1536          ("Fcst", "Swell2", "VECTOR", 0, 6,  (0,"E"), "all"),
1537          ("Fcst", "Period", "SCALAR", 0, 6, 5, "all"),
1538          ("Fcst", "Period2", "SCALAR", 0, 6, 10, "all"),
1539          ("Fcst", "Swell", "VECTOR", 6, 12,  (0,"NW"), "all"),
1540          ("Fcst", "Swell2", "VECTOR", 6, 12,  (0,"SE"), "all"),
1541          ("Fcst", "Period", "SCALAR", 6, 12, 5, "all"),
1542          ("Fcst", "Period2", "SCALAR", 6, 12, 10, "all"),
1543          ],
1544       "checkStrings": [
1545          "",
1546          ],
1547       "comboFlag": 1,                    
1548       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1549       "gridsStartTime": "6am Local",
1550       "drtTime": "4am Local",
1551       },    
1552       {
1553       "name": "CWF_Swell_withPeriod7",
1554       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell null in both",
1555       "productType": "CWF",
1556       "createGrids": [
1557          ("Fcst", "Swell", "VECTOR", 0, 6,  (0,"N"), "all"),
1558          ("Fcst", "Swell2", "VECTOR", 0, 6,  (14,"N"), "all"),
1559          ("Fcst", "Period", "SCALAR", 0, 6, 5, "all"),
1560          ("Fcst", "Period2", "SCALAR", 0, 6, 10, "all"),
1561          ("Fcst", "Swell", "VECTOR", 6, 12,  (0,"NW"), "all"),
1562          ("Fcst", "Swell2", "VECTOR", 6, 12,  (7,"SE"), "all"),
1563          ("Fcst", "Period", "SCALAR", 6, 12, 5, "all"),
1564          ("Fcst", "Period2", "SCALAR", 6, 12, 10, "all"),
1565          ],
1566       "checkStrings": [
1567          "SWELL SOUTHEAST 8 TO 13 FEET",
1568          ],
1569       "comboFlag": 1,                    
1570       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1571       "gridsStartTime": "6am Local",
1572       "drtTime": "4am Local",
1573       },    
1574       {
1575       "name": "CWF_Swell_withPeriod8",
1576       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell2 null in first",
1577       "productType": "CWF",
1578       "createGrids": [
1579          ("Fcst", "Swell", "VECTOR", 0, 6,  (7,"N"), "all"),
1580          ("Fcst", "Swell2", "VECTOR", 0, 6,  (0,"E"), "all"),
1581          ("Fcst", "Period", "SCALAR", 0, 6, 5, "all"),
1582          ("Fcst", "Period2", "SCALAR", 0, 6, 10, "all"),
1583          ("Fcst", "Swell", "VECTOR", 6, 12,  (14,"NW"), "all"),
1584          ("Fcst", "Swell2", "VECTOR", 6, 12,  (7,"SE"), "all"),
1585          ("Fcst", "Period", "SCALAR", 6, 12, 5, "all"),
1586          ("Fcst", "Period2", "SCALAR", 6, 12, 10, "all"),
1587          ],
1588       "checkStrings": [
1589          "NORTH SWELL AROUND 7 FEET AT 5 SECONDS INCREASING TO NORTHWEST AROUND 14 FEET AT 5 SECONDS AND SOUTHEAST AROUND 7 FEET AT 10 SECONDS IN THE AFTERNOON",
1590          ],
1591       "comboFlag": 1,                    
1592       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1593       "gridsStartTime": "6am Local",
1594       "drtTime": "4am Local",
1595       },    
1596       {
1597       "name": "CWF_Swell_withPeriod9",
1598       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell null in first",
1599       "productType": "CWF",
1600       "createGrids": [
1601          ("Fcst", "Swell", "VECTOR", 0, 6,  (0,"N"), "all"),
1602          ("Fcst", "Swell2", "VECTOR", 0, 6,  (14,"E"), "all"),
1603          ("Fcst", "Period", "SCALAR", 0, 6, 5, "all"),
1604          ("Fcst", "Period2", "SCALAR", 0, 6, 10, "all"),
1605          ("Fcst", "Swell", "VECTOR", 6, 12,  (14,"NW"), "all"),
1606          ("Fcst", "Swell2", "VECTOR", 6, 12,  (7,"SE"), "all"),
1607          ("Fcst", "Period", "SCALAR", 6, 12, 5, "all"),
1608          ("Fcst", "Period2", "SCALAR", 6, 12, 10, "all"),
1609          ],
1610       "checkStrings": [
1611          "SWELL EAST AROUND 14 FEET AT 10 SECONDS INCREASING TO NORTHWEST AROUND 14 FEET AT 5 SECONDS AND SOUTHEAST AROUND 7 FEET AT 10 SECONDS IN THE AFTERNOON",
1612          ],
1613       "comboFlag": 1,                    
1614       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1615       "gridsStartTime": "6am Local",
1616       "drtTime": "4am Local",
1617       },
1618       {
1619       "name": "CWF_Swell_withPeriod10",
1620       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell same mag, Swell2 null in both",
1621       "productType": "CWF",
1622       "createGrids": [
1623          ("Fcst", "Swell", "VECTOR", 0, 6,  (7,"N"), "all"),
1624          ("Fcst", "Swell2", "VECTOR", 0, 6,  (0,"E"), "all"),
1625          ("Fcst", "Period", "SCALAR", 0, 6, 5, "all"),
1626          ("Fcst", "Period2", "SCALAR", 0, 6, 10, "all"),
1627          ("Fcst", "Swell", "VECTOR", 6, 12,  (10,"NW"), "all"),
1628          ("Fcst", "Swell2", "VECTOR", 6, 12,  (0,"SE"), "all"),
1629          ("Fcst", "Period", "SCALAR", 6, 12, 5, "all"),
1630          ("Fcst", "Period2", "SCALAR", 6, 12, 10, "all"),
1631          ],
1632       "checkStrings": [
1633          "NORTHWEST SWELL 7 TO 10 FEET AT 5 SECONDS",
1634          ],
1635       "comboFlag": 1,                    
1636       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1637       "gridsStartTime": "6am Local",
1638       "drtTime": "4am Local",
1639       },    
1640  
1641       {
1642       "name": "CWF_Swell_withPeriod11",
1643       "commentary": "CWF Swell phrase: 2 sub-phrases, Swell null in both, Swell2 same mag",
1644       "productType": "CWF",
1645       "createGrids": [
1646          ("Fcst", "Swell", "VECTOR", 0, 6,  (0,"N"), "all"),
1647          ("Fcst", "Swell2", "VECTOR", 0, 6,  (10,"E"), "all"),
1648          ("Fcst", "Period", "SCALAR", 0, 6, 5, "all"),
1649          ("Fcst", "Period2", "SCALAR", 0, 6, 10, "all"),
1650          ("Fcst", "Swell", "VECTOR", 6, 12,  (0,"NW"), "all"),
1651          ("Fcst", "Swell2", "VECTOR", 6, 12,  (7,"SE"), "all"),
1652          ("Fcst", "Period", "SCALAR", 6, 12, 5, "all"),
1653          ("Fcst", "Period2", "SCALAR", 6, 12, 10, "all"),
1654          ],
1655       "checkStrings": [
1656          "SWELL SOUTHEAST 7 TO 10 FEET AT 10 SECONDS",
1657          ],
1658       "comboFlag": 1,                    
1659       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1660       "gridsStartTime": "6am Local",
1661       "drtTime": "4am Local",
1662       },
1663  
1664       # TK 4688  Null Swell
1665       {
1666       "name": "CWF_NullSwell",
1667       "commentary": "CWF Swell phrase: Test user-set null phrase",
1668       "productType": "CWF",
1669       "createGrids": [
1670          ("Fcst", "Swell", "VECTOR", 0, 12,  (2,"N"), "all"),
1671          ("Fcst", "Swell2", "VECTOR", 0, 12,  (2,"N"), "all"),
1672          ],
1673       "checkStrings": [
1674          "LIGHT SWELLS",
1675          ],
1676       "comboFlag": 1,
1677       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1678       "gridsStartTime": "6am Local",
1679       "drtTime": "4am Local",
1680       "fileChanges":[
1681          ("CWF_<site>_Overrides", "TextUtility", "add", CWFPeriod, "undo"),
1682          ("CWF_<site>_Overrides", "TextUtility", "add", nullSwell, "undo"),
1683          ],
1684       },
1685  
1686       {    
1687       "name":"SwellPeriodCleanUp",
1688       "commentary": "Clean out grids",
1689       "productType": None,
1690       "deleteGrids": [
1691           ("Fcst", "Swell", "SFC", 0,280),
1692           ("Fcst", "Swell2", "SFC", 0,280),
1693           ("Fcst", "Period", "SFC", 0,280),
1694           ("Fcst", "Period2", "SFC", 0,280),
1695           ],
1696       "gridsStartTime": "6am Local",
1697       },
1698  
1699  
1700       ## Period Combining  Matt Foster
1701       {
1702       "name": "PeriodCombine1",
1703       "commentary": "Period combining with NoWx and SChc",
1704       "productType": "ZFP",
1705       "createGrids": [#TestScript.general_createGrids + [    
1706          ("Fcst", "Sky", "SCALAR", 48, 72, 0, "all"),
1707          ("Fcst", "Sky", "SCALAR", 72, 78, 0, "all"),
1708          ("Fcst", "Sky", "SCALAR", 78, 84, 0, "all"),
1709          ("Fcst", "Sky", "SCALAR", 84, 90, 0, "all"),
1710          ("Fcst", "Sky", "SCALAR", 90, 96, 0, "all"),
1711          ("Fcst", "Sky", "SCALAR", 96, 102, 0, "all"),
1712          ("Fcst", "Sky", "SCALAR", 102, 108, 0, "all"),
1713          ("Fcst", "Sky", "SCALAR", 108, 114, 0, "all"),
1714          ("Fcst", "Sky", "SCALAR", 114, 120, 40, "all"),
1715          ("Fcst", "Wx", "WEATHER", 48, 72, "NoWx", "all"),
1716          ("Fcst", "Wx", "WEATHER", 72, 78, "NoWx", "all"),
1717          ("Fcst", "Wx", "WEATHER", 78, 84, "NoWx", "all"),
1718          ("Fcst", "Wx", "WEATHER", 84, 90, "NoWx", "all"),
1719          ("Fcst", "Wx", "WEATHER", 90, 96, "NoWx", "all"),
1720          ("Fcst", "Wx", "WEATHER", 96, 102, "NoWx", "all"),
1721          ("Fcst", "Wx", "WEATHER", 102, 108, "NoWx", "all"),
1722          ("Fcst", "Wx", "WEATHER", 108, 114, "NoWx", "all"),
1723          ("Fcst", "Wx", "WEATHER", 114, 128, "NoWx", "all"),
1724          ("Fcst", "Wx", "WEATHER", 128, 142, "SChc:T:<NoInten>:<NoVis>:", "all"),
1725          #("Fcst", "Wx", "WEATHER", 128, 152, "NoWx", "all"),
1726          ("Fcst", "PoP", "SCALAR", 48, 128, 0, "all"),
1727          ("Fcst", "PoP", "SCALAR", 128, 142, 20, "all"),
1728          #("Fcst", "PoP", "SCALAR", 128, 152, 0, "all"),
1729   ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+24", "MaxTEnd+24", 70, "all"),
1730   ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+24", "MinTEnd+24", 43, "all"),
1731   ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+48", "MaxTEnd+48", 70, "all"),
1732   ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+48", "MinTEnd+48", 43, "all"),
1733   ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+60", "MaxTEnd+60", 70, "all"),
1734   ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+60", "MinTEnd+60", 43, "all"),
1735   ##       ("Fcst", "MaxT", "SCALAR", "MaxTBegin+72", "MaxTEnd+72", 70, "all"),
1736   ##       ("Fcst", "MinT", "SCALAR", "MinTBegin+72", "MinTEnd+72", 43, "all"),
1737   ##       ("Fcst", "Wind", "VECTOR", 36, 72, (10, "SW"), "all"),
1738              ],
1739       "checkStrings": [
1740          "SUNDAY NIGHT THROUGH WEDNESDAY NIGHT...",
1741          ],
1742       "fileChanges": [
1743          ("ZFP_<site>_Definition", "TextUtility", "replace",
1744          (periodCombine1, periodCombine2), "undo"),
1745          ("ZFP_<site>_Definition", "TextUtility", "replace",
1746          (hoursSChc1, hoursSChc2), "undo"),
1747          ("ZFP_<site>_Overrides", "TextUtility", "add", pcElementList, "undo"),
1748          ],
1749       "comboFlag": 1,
1750       "gridsStartTime": "6am Local",
1751       "drtTime": "6am Local",                    
1752       },
1753  
1754       #  TK 4475 hoursSChcEnds handling pre-first period
1755       {
1756       "name": "hoursSChcEnds1",
1757       "commentary": "hoursSChcEnds for pre-first period",
1758       "productType": "ZFP",
1759       "createGrids": [
1760          ("Fcst", "PoP", "SCALAR", -6, 12, 15, "all", 1),
1761          ("Fcst", "Wx", "WEATHER", -6, 0, "SChc:T:<NoInten>:<NoVis>:", "all"),
1762          ("Fcst", "Wx", "WEATHER", 0, 12,"SChc:T:<NoInten>:<NoVis>:", "all"),
1763          ],
1764       "cmdLineVars" : "{('Product Issuance', 'productIssuance'): 'Morning with Pre-1st Period', ('Issued By', 'issuedBy'): None}",
1765       "checkStrings": [
1766          "A 20 PERCENT CHANCE OF THUNDERSTORMS",
1767          ],
1768       "comboFlag": 1,
1769                       
1770       },
1771  
1772       ## Period Combining  Label ER Tk 4468
1773       {
1774       "name": "PeriodCombineLabel1",
1775       "commentary": "Period combining labelling for CWF",
1776       "productType": "CWF",
1777       "createGrids": [#TestScript.general_createGrids + [    
1778          ("Fcst", "Sky", "SCALAR", 48, 72, 0, "all"),
1779          ("Fcst", "Sky", "SCALAR", 72, 78, 0, "all"),
1780          ("Fcst", "Sky", "SCALAR", 78, 84, 0, "all"),
1781          ("Fcst", "Sky", "SCALAR", 84, 90, 0, "all"),
1782          ("Fcst", "Sky", "SCALAR", 90, 96, 0, "all"),
1783          ("Fcst", "Sky", "SCALAR", 96, 102, 0, "all"),
1784          ("Fcst", "Sky", "SCALAR", 102, 108, 0, "all"),
1785          ("Fcst", "Sky", "SCALAR", 108, 114, 0, "all"),
1786          ("Fcst", "Sky", "SCALAR", 114, 120, 40, "all"),
1787          ("Fcst", "Wx", "WEATHER", 48, 72, "Chc:RW:-:<NoVis>:", "all"),
1788          ("Fcst", "Wx", "WEATHER", 72, 78, "Chc:RW:-:<NoVis>:", "all"),
1789          ("Fcst", "Wx", "WEATHER", 78, 84, "NoWx", "all"),
1790          ("Fcst", "Wx", "WEATHER", 84, 90, "NoWx", "all"),
1791          ("Fcst", "Wx", "WEATHER", 90, 96, "NoWx", "all"),
1792          ("Fcst", "Wx", "WEATHER", 96, 102, "NoWx", "all"),
1793          ("Fcst", "Wx", "WEATHER", 102, 108, "NoWx", "all"),
1794          ("Fcst", "Wx", "WEATHER", 108, 114, "NoWx", "all"),
1795          ("Fcst", "Wx", "WEATHER", 114, 128, "NoWx", "all"),
1796          ("Fcst", "Wx", "WEATHER", 128, 142, "SChc:T:<NoInten>:<NoVis>:", "all"),
1797          ("Fcst", "PoP", "SCALAR", 48, 128, 30, "all"),
1798          ("Fcst", "PoP", "SCALAR", 128, 142, 30, "all"),
1799              ],
1800       "checkStrings": [
1801          ".SUNDAY AND SUNDAY NIGHT...", "CHANCE OF SHOWERS.",
1802          ".MONDAY THROUGH TUESDAY...",
1803          ],
1804       "fileChanges":[
1805          ("CWF_<site>_Definition", "TextUtility", "add", periodCombine2, "undo"),
1806          ("CWF_<site>_Overrides", "TextUtility", "add", pcElementList, "undo"),
1807          ],
1808       "comboFlag": 1,
1809       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1810       "gridsStartTime": "6am Local",
1811       "drtTime": "6am Local",           
1812       },
1813  
1814       # Visibility phrase tests TK 4658    
1815       {
1816       "name": "CWF_Vis",
1817       "commentary": "CWF Visibility phrase: 1st period SChc:SW, 2nd period Sct:RW",
1818       "productType": "CWF",
1819       "fileChanges":[
1820          ("CWF_<site>_Overrides", "TextUtility", "add", marine_wx, "undo"),
1821          ],
1822       "createGrids": [
1823          ("Fcst", "Wx", "WEATHER", 0, 12, "SChc:SW:-:2SM:", "all"),
1824          ("Fcst", "Wx", "WEATHER", 12, 24, "Sct:RW:-:1/4SM:", "all"),
1825          ("Fcst", "PoP", "SCALAR", 0, 12, 10, "all"),
1826          ("Fcst", "PoP", "SCALAR", 12, 24, 50, "all"),
1827          ],
1828       "checkStrings": [
1829          ".TONIGHT...", "SCATTERED SHOWERS", "VISIBILITY 1 NM OR LESS",
1830          ".SATURDAY...",
1831          ],
1832       "notCheckStrings":[
1833          "SCATTERED SNOW SHOWERS", "VISIBILITY 2 NM",
1834          ],
1835       "comboFlag": 1,
1836       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1837       "gridsStartTime": "6am Local",
1838       "drtTime": "4am Local",
1839       },    
1840       {
1841       "name": "GLF_Vis",
1842       "commentary": "GLF Visibility phrase: 1st period SChc:SW, 2nd period Sct:RW",
1843       "productType": "GLF",
1844       "fileChanges":[
1845          ("GLF_<site>_Overrides", "TextUtility", "add", marine_wx, "undo"),
1846          ],
1847       "createGrids": [
1848          ("Fcst", "Wx", "WEATHER", 0, 12, "SChc:SW:-:2SM:", "all"),
1849          ("Fcst", "Wx", "WEATHER", 12, 24, "Sct:RW:-:1/4SM:", "all"),
1850          ("Fcst", "PoP", "SCALAR", 0, 12, 10, "all"),
1851          ("Fcst", "PoP", "SCALAR", 12, 24, 50, "all"),
1852          ],
1853       "checkStrings": [
1854          ".TONIGHT...", "SCATTERED SHOWERS", "VSBY ONE QUARTER MILE OR LESS AT TIMES",
1855          ".SAT...",
1856          ],
1857       "notCheckStrings":[
1858          "SCATTERED SNOW SHOWERS",
1859          ],
1860       "comboFlag": 1,
1861       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '400 AM', ('Groupings', 'groupings'): 'West 1/2:East 1/2'}",
1862       "gridsStartTime": "6am Local",
1863       "drtTime": "4am Local",
1864       },    
1865       {
1866       "name": "NSH_Vis",
1867       "commentary": "NSH Visibility phrase: 1st period SChc:SW, 2nd period Sct:RW",
1868       "productType": "NSH",
1869       "fileChanges":[
1870          ("NSH_<site>_Overrides", "TextUtility", "add", marine_wx, "undo"),
1871          ],
1872       "createGrids": [
1873          ("Fcst", "Wx", "WEATHER", 0, 12, "SChc:SW:-:2SM:", "all"),
1874          ("Fcst", "Wx", "WEATHER", 12, 24, "Sct:RW:-:1/4SM:", "all"),
1875          ("Fcst", "PoP", "SCALAR", 0, 12, 10, "all"),
1876          ("Fcst", "PoP", "SCALAR", 12, 24, 50, "all"),
1877          ],
1878       "checkStrings": [
1879          ".TONIGHT...", "SCATTERED SHOWERS",
1880          "VISIBILITY ONE QUARTER MILE OR LESS AT TIMES",
1881          ".SATURDAY...",
1882          ],
1883       "notCheckStrings":[
1884          "SCATTERED SNOW SHOWERS", "VISIBILITY 2 NM",
1885          ],
1886       "comboFlag": 1,
1887       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '430 AM', ('Issued By', 'issuedBy'): None}",
1888       "gridsStartTime": "6am Local",
1889       "drtTime": "4am Local",
1890       },    
1891           {
1892       "name": "OFF_Vis",
1893       "commentary": "OFF Visibility phrase: 1st period SChc:SW, 2nd period Sct:RW",
1894       "productType": "OFF",
1895       "fileChanges":[
1896          ("OFF_<site>_Overrides", "TextUtility", "add", marine_wx, "undo"),
1897          ],
1898       "createGrids": [
1899          ("Fcst", "Wx", "WEATHER", 0, 12, "SChc:SW:-:2SM:", "all"),
1900          ("Fcst", "Wx", "WEATHER", 12, 24, "Sct:RW:-:1/4SM:", "all"),
1901          ("Fcst", "PoP", "SCALAR", 0, 12, 10, "all"),
1902          ("Fcst", "PoP", "SCALAR", 12, 24, 50, "all"),
1903          ],
1904       "checkStrings": [
1905          ".TONIGHT...", "SCATTERED SHOWERS", "VISIBILITY 1 NM OR LESS",
1906          ".SATURDAY...",
1907          ],
1908       "notCheckStrings":[
1909          "SCATTERED SNOW SHOWERS", "VISIBILITY 2 NM",
1910          ],
1911       "comboFlag": 1,
1912       "cmdLineVars": "{('Product Issuance', 'productIssuance'): '400 AM', ('Issued By', 'issuedBy'): None}",
1913       "gridsStartTime": "6am Local",
1914       "drtTime": "4am Local",
1915       },    
1916           
1917       {
1918       "name": "ZFP_Vis",  
1919       "commentary": "Visibility: Report for significant key BS, not for RW",
1920       "productType": "ZFP",
1921       "createGrids": [
1922          ("Fcst", "Wx", "WEATHER", 0, 12, "Sct:RW:-:1/4SM:", "all"),
1923          ("Fcst", "Wx", "WEATHER", 12, 24, "Areas:BS:<NoInten>:1/4SM:", "all"),
1924          ("Fcst", "PoP", "SCALAR", 0, 12, 50, "all"),
1925          ("Fcst", "PoP", "SCALAR", 12, 24, 10, "all"),
1926          ],
1927       "checkStrings": [
1928          ".TODAY...", "SCATTERED SHOWERS",
1929          ".TONIGHT...", "AREAS OF BLOWING SNOW.", 
1930          "VISIBILITY ONE QUARTER MILE OR LESS AT TIMES.",
1931          ".SATURDAY...",
1932          ],
1933       "gridsStartTime": "6am Local",
1934       "drtTime": "4am Local",
1935       },
1936  
1937       {    
1938       "name":"General_CleanUp",
1939       "commentary": "Clean out grids",
1940       "productType": None,
1941       "deleteGrids": TestScript.general_deleteGrids,
1942       "gridsStartTime": "6am Local",
1943       },
1944       
1945       ]
1946  
1947   def testScript(self, dataMgr, level="Site"):
1948       defaults = {
1949           "database": "<site>_GRID__Fcst_00000000_0000",
1950           "combinations": "ZONE",
1951           }
1952       # Necessary to do drt for scripts 
1953       # that start the product with current time
1954       time_4am = self.getAbsFromLocal(2010, 1, 1, 4, 0)
1955       time_6am = self.getAbsFromLocal(2010, 1, 1, 6, 0)
1956       for script in scripts:
1957           if script.get("gridsStartTime", None) == "6am Local":
1958               script["gridsStartTime"] = time_6am
1959           if script.get("drtTime", None) == "4am Local":
1960               script["drtTime"] = time_6am
1961           elif script.get("drtTime", None) == "6am Local":
1962               script["drtTime"] = time_6am
1963       return TestScript.generalTestScript(self, dataMgr, scripts, defaults)
1964  
1965