from datetime import timedelta
from MythTV.utility.dt import datetime, posixtzinfo

TZ='America/Los_Angeles'
START_DST = ('2013-03-10T08:00:00Z',)
END_DST = ('2013-11-03T07:00:00Z',)

EXPECT_START = {
    '2013-03-10T08:00:00+00:00' : (
        '2013-03-10 00:00:00-08:00',
        '2013-03-10 00:30:00-08:00',
        '2013-03-10 01:00:00-08:00',
        '2013-03-10 01:30:00-08:00',
        '2013-03-10 03:00:00-07:00',
        '2013-03-10 03:30:00-07:00',
        '2013-03-10 04:00:00-07:00',
        '2013-03-10 04:30:00-07:00',
        '2013-03-10 05:00:00-07:00',
        '2013-03-10 05:30:00-07:00',
        )
}

EXPECT_END = {
    '2013-11-03T07:00:00+00:00' : (
        '2013-11-03 00:00:00-07:00',
        '2013-11-03 00:30:00-07:00',
        '2013-11-03 01:00:00-08:00',
        '2013-11-03 01:30:00-08:00',
        '2013-11-03 01:00:00-08:00',
        '2013-11-03 01:30:00-08:00',
        '2013-11-03 02:00:00-08:00',
        '2013-11-03 02:30:00-08:00',
        '2013-11-03 03:00:00-08:00',
        '2013-11-03 03:30:00-08:00',
        )
}

PASS_COUNT=0
FAIL_COUNT=0
TEST_COUNT=0

def test_range(times, expects):
    global PASS_COUNT, FAIL_COUNT, TEST_COUNT
    num_slots = 10
    tz = posixtzinfo(TZ)
    for tm in times:
        start = datetime.duck(tm)
        expected = expects[start.isoformat()]
        timeslots = [start + timedelta(minutes=i*30) for i in range(num_slots)]
        print '%26s %26s %4s %10s %6s' % ('UTC', 'UTC -> Local', 'TZ', 'dst', 'result')
        for i,t in enumerate(timeslots):
            TEST_COUNT += 1
            local = t.astimezone(tz)
            status = "pass" if str(local) == expected[i] else "FAIL"
            if status == 'pass':
                PASS_COUNT += 1
            elif status == 'FAIL':
                FAIL_COUNT += 1
            print '%26s %26s %4s %10s %6s' % \
                (t, local, tz.tzname(local), tz.dst(local), status)

print 'Testing Start of DST'
test_range(START_DST, EXPECT_START)
print
print '*' * 78
print

print 'Testing End of DST'
test_range(END_DST, EXPECT_END)
print
print '*' * 78
print

if PASS_COUNT == TEST_COUNT:
    print "All %s tests PASSED" % PASS_COUNT
elif FAIL_COUNT == TEST_COUNT:
    print "All %s tests FAILED" % FAIL_COUNT
else:
    print "%s PASS, %s FAIL" % (PASS_COUNT, FAIL_COUNT)
