walltime-js
Version:
A javascript library for easily translating a UTC time to a "Wall Time" for a particular time zone and back.
185 lines (131 loc) • 7.15 kB
text/coffeescript
should = require "should"
helpers = require "../lib/olson/helpers"
OlsonCommon = require "../lib/olson/common"
Handlers = (require "../lib/olson/rule").OnFieldHandlers
OlsonRule = OlsonCommon.Rule
OlsonRuleSet = OlsonCommon.RuleSet
describe "Olson Rules", ->
ruleLine = "rule\tChicago\t1920\tonly\t-\tJun\t13\t2:00\t1:00\tD"
atUTCRuleLine = "rule\tChicago\t1920\tonly\t-\tJun\t13\t23:00u\t1:00\tD"
atSTDRuleLine = "rule\tChicago\t1920\tonly\t-\tJun\t13\t23:00s\t1:00\tD"
utcZone =
offset:
negative: false
hours: 0
mins: 0
secs: 0
chiZone =
offset:
negative: true
hours: 6
mins: 0
secs: 0
noSaveState =
hours: 0
mins: 0
dstSaveState =
hours: 1
mins: 0
makeRule = -> new OlsonRule("Chicago", "1920", "only", "-", "Jun", "13", "2:00", "1:00", "D")
#makeUtcRule = -> new OlsonRule("Chicago", "1920", "only", "-", "Jun", "13", "23:00u", "1:00", "D")
#makeStdRule = -> new OlsonRule("Chicago", "1920", "only", "-", "Jun", "13", "23:00s", "1:00", "D")
rule = makeRule()
beforeEach: ->
rule = makeRule()
describe "'on' Field Handlers", ->
numberHandler = new Handlers.NumberHandler
lastHandler = new Handlers.LastHandler
compareHandler = new Handlers.CompareHandler
commonHandlerTest = (str, year, month, handler, expectApply, expectResult) ->
applies = handler.applies str, year, month
applies.should.equal expectApply, "applies"
return unless applies
offset =
negative: true
hours: 6
mins: 0
secs: 0
save =
hours: 1
mins: 0
qualifier = "w"
expectResult.should.equal handler.parseDate(str, year, month, qualifier, offset, save), "parseDate - #{str}"
it "handles specific date fields", ->
commonHandlerTest "13", 1920, 5, numberHandler, true, 13
commonHandlerTest "lastSun", 1920, 5, numberHandler, false, 0
commonHandlerTest "Fri>=8", 1920, 5, numberHandler, false, 0
it "handles last day fields (lastSun)", ->
commonHandlerTest "lastSun", 1920, 9, lastHandler, true, 31
commonHandlerTest "124", 1920, 9, lastHandler, false
commonHandlerTest "Sat>=1", 1920, 9, lastHandler, false
it "handles compare fields (Sun>=8)", ->
commonHandlerTest "Sun>=1", 1920, 9, compareHandler, true, 3
commonHandlerTest "Sun>=8", 1920, 9, compareHandler, true, 10
commonHandlerTest "Sun>=10", 1920, 9, compareHandler, true, 10
commonHandlerTest "Sun>=11", 1920, 9, compareHandler, true, 17
commonHandlerTest "13", 1920, 9, compareHandler, false
commonHandlerTest "lastSun", 1920, 9, compareHandler, false
it "calculates the begin time in UTC without daylight savings offset", ->
# Chicago zone (-5 Hour Offset) and no save state.
rule.forZone chiZone.offset
expected = helpers.Time.MakeDateFromParts rule.from, 0, 1
expected = helpers.Time.ApplyOffset expected, chiZone.offset
rule.fromUTC.should.equal expected, "Chi - No Save State"
it "calculates the end time in UTC with daylight savings offset", ->
rule.forZone chiZone.offset
expected = helpers.Time.MakeDateFromParts rule.from, 11, 31, 23, 59, 59, 999
expected = helpers.Time.ApplyOffset expected, chiZone.offset
rule.toUTC.should.equal expected, "Chi - No Save State"
describe "Sets", ->
rules = [
new OlsonRule("Chicago", "1920", "only", "-", "Jun", "13", "2:00", "1:00", "D"),
new OlsonRule("Chicago", "1920", "1921", "-", "Oct", "lastSun", "2:00", "0", "S"),
new OlsonRule("Chicago", "1921", "only", "-", "Mar", "lastSun", "2:00", "1:00", "D"),
new OlsonRule("Chicago", "1922", "1922", "-", "Apr", "lastSun", "2:00", "1:00", "D"),
new OlsonRule("Chicago", "1922", "1922", "-", "Sep", "lastSun", "2:00", "0", "S"),
new OlsonRule("Chicago", "1925", "1955", "-", "Oct", "lastSun", "2:00", "0", "S")
]
set = new OlsonRuleSet(rules, chiZone)
commonWallTimeTest = (point, zone, save) ->
result = set.getWallTimeForUTC point
result.offset.hours.should.equal zone.offset.hours, "Offset hours"
result.offset.mins.should.equal zone.offset.mins, "Offset mins"
result.offset.secs.should.equal zone.offset.secs, "Offset secs"
result.save.hours.should.equal save.hours
result.save.mins.should.equal save.mins
result.utc.should.equal point, "UTC time"
expect = point
expect = helpers.Time.UTCToWallTime point, result.offset, result.save
result.wallTime.should.equal expect
it "can tell what rules apply for a given UTC time", ->
point = helpers.Time.StandardTimeToUTC chiZone.offset, 1920, 0, 1
result = set.allThatAppliesTo point
result.length.should.equal 2, "length"
result[0].should.equal rules[0], "first rule"
result[1].should.equal rules[1], "second rule"
it "can get WallTime for before rules take effect", ->
# Before any rules
point = helpers.Time.MakeDateFromParts 1900, 0, 1
commonWallTimeTest point, chiZone, noSaveState
it "can get WallTime for beginning of year", ->
# Beginning of year with 2 rules.
point = helpers.Time.MakeDateFromParts 1920, 0, 1
commonWallTimeTest point, chiZone, noSaveState
it "can get WallTime for before dst rule takes effect", ->
# Immediately before the dst rule
point = helpers.Time.StandardTimeToUTC chiZone.offset, 1920, 5, 13, 1, 59, 59
commonWallTimeTest point, chiZone, noSaveState
it "can get WallTime with 1 hour saved for after dst rule", ->
# Immediately after the daylight savings rule (second of)
point = helpers.Time.StandardTimeToUTC chiZone.offset, 1920, 5, 13, 2, 0, 0
commonWallTimeTest point, chiZone, dstSaveState
it "can get WallTime for right before switching to no dst", ->
# Immediately before the dst rule expires
point = helpers.Time.WallTimeToUTC chiZone.offset, dstSaveState, 1920, 9, 31, 1, 59, 59
commonWallTimeTest point, chiZone, dstSaveState
it "can get WallTime for after dst expires", ->
# Immediately after the dst rule expires
point = helpers.Time.MakeDateFromParts 1920, 9, 31, 2, 0, 0
point = helpers.Time.ApplyOffset point, chiZone.offset
point = helpers.Time.ApplySave point, dstSaveState
commonWallTimeTest point, chiZone, noSaveState