Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Specs for date utils
requireModules(['common.date_utils'], function (u) {
describe('Moment', function () { // returns a new Moment
it('should create a representation of a fixed date and time', function () {
var moment = new u.Moment(1347915062072);
expect(typeof moment.add).toBe('function');
});
it('should create a Moment from nothing', function () {
var moment = new u.Moment();
expect(typeof moment.add).toBe('function');
});
it('should create a Moment from a JS Date', function () {
var d = new Date();
var moment = new u.Moment(d);
expect(typeof moment.add).toBe('function');
});
it('should create a Moment from a string parsable into a JS date', function () {
var moment = new u.Moment('Fri, 12 Oct 2012 19:15:56 UTC');
expect(typeof moment.add).toBe('function');
});
it('should allow moments to be cloned', function () {
var moment1 = new u.Moment(1347915062072);
var moment2 = moment1.clone();
expect(moment1).not.toBe(moment2);
expect(moment1.getDate()).toEqual(moment2.getDate());
});
it('should create a moment from an ISO-8601 subset string', function () {
var moment1 = new u.Moment('1978-06-14');
var moment2 = new u.Moment('1978-06-14T06:14:00');
var moment3 = new u.Moment('1978-06-14T06:14:00-05:00');
expect(moment1.getDate()).toBe(14);
expect(moment2.getDate()).toBe(14);
expect(moment2.getMinutes()).toBe(14);
expect(moment2.getYear()).toBe(1978);
// expect(moment3.getHours()).toBe(7); Add for your timezone, disabling because this won't always be run in NYC
});
});
describe('Moment toDate', function () {
it('should return a JS date object for a moment', function () {
var stamp = 1347915062072;
var moment = new u.Moment(stamp);
var date = moment.toDate();
expect(typeof date.constructor).toBe('function'); // Is this because of Rhino, or does the method not work?
expect(moment.toDate().valueOf()).toBe(1347915062072);
});
});
describe('Moment setToStartOf', function () { // returns the same Moment???
it('should set the start of a moment by hour', function () {
var moment = new u.Moment(1347915062072);
moment.setToStartOf('hour');
expect(moment.getSeconds()).toBe(0);
expect(moment.getMinutes()).toBe(0);
expect(moment.getHours()).toBe(16);
});
it('should set the start of a moment by day', function () {
var moment = new u.Moment(1347915062072);
moment.setToStartOf('day');
expect(moment.getSeconds()).toBe(0);
expect(moment.getHours()).toBe(0);
expect(moment.getYear()).toBe(2012);
});
it('should set the start of a moment by month', function () {
var moment = new u.Moment(1347915062072);
moment.setToStartOf('month');
expect(moment.getSeconds()).toBe(0);
expect(moment.getHours()).toBe(0);
expect(moment.getMonth()).toBe(8);
expect(moment.getYear()).toBe(2012);
});
it('should set the start of a moment by year', function () {
var moment = new u.Moment(1347915062072);
moment.setToStartOf('year');
expect(moment.getSeconds()).toBe(0);
expect(moment.getHours()).toBe(0);
expect(moment.getMonth()).toBe(0);
expect(moment.getYear()).toBe(2012);
});
});
describe('Moment setToEndOf', function () { // returns the same Moment???
it('should set the end of a moment by hour', function () {
var moment = new u.Moment(1347915062072);
moment.setToEndOf('hour');
expect(moment.getSeconds()).toBe(59);
expect(moment.getMinutes()).toBe(59);
expect(moment.getHours()).toBe(16);
});
it('should set the end of a moment by day', function () {
var moment = new u.Moment(1347915062072);
moment.setToEndOf('day');
expect(moment.getSeconds()).toBe(59);
expect(moment.getMinutes()).toBe(59);
expect(moment.getHours()).toBe(23);
});
it('should set the end of a moment by month', function () {
var moment = new u.Moment(1347915062072);
moment.setToEndOf('month');
expect(moment.getSeconds()).toBe(59);
expect(moment.getMinutes()).toBe(59);
expect(moment.getHours()).toBe(23);
expect(moment.getDate()).toBe(30);
var moment2 = new u.Moment(1328903062072);
moment2.setToEndOf('month');
expect(moment2.getDate()).toBe(29);
});
it('should set the end of a moment by year', function () {
var moment = new u.Moment(1347915062072);
moment.setToEndOf('year');
expect(moment.getSeconds()).toBe(59);
expect(moment.getMinutes()).toBe(59);
expect(moment.getHours()).toBe(23);
expect(moment.getDate()).toBe(31);
expect(moment.getMonth()).toBe(11);
});
});
describe('Moment set functions', function () { // TODO: How to handle +- conditions as well as absolute conditions? '+1'? // returns the same Moment
it('should allow a moment to be set using a Date object', function () {
var d = new Date(1347915062072);
var moment = new u.Moment(d);
expect(moment.getYear()).toBe(2012);
});
it('should allow a moment to be set by year', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getYear()).toBe(2012);
moment.setYear(2013);
expect(moment.getYear()).toBe(2013);
});
it('should allow a moment to be set by month', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getMonth()).toBe(8);
moment.setMonth(9);
expect(moment.getMonth()).toBe(9);
});
it('should allow a moment to be set by date', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getDate()).toBe(17);
moment.setDate(20);
expect(moment.getDate()).toBe(20);
});
it('should allow a moment to be set by hour', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getHours()).toBe(16);
moment.setHours(15);
expect(moment.getHours()).toBe(15);
});
it('should allow a moment to be set by minute', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getMinutes()).toBe(51);
moment.setMinutes(23);
expect(moment.getMinutes()).toBe(23);
});
it('should allow a moment to be set by second', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getSeconds()).toBe(2);
moment.setSeconds(42);
expect(moment.getSeconds()).toBe(42);
});
it('should allow a moment to be set by millisecond', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getMilliseconds()).toBe(72);
moment.setMilliseconds(123);
expect(moment.getMilliseconds()).toBe(123);
});
});
describe('Moment get functions', function () { // returns values of a Moment
it('should return the value of the moment milliseconds', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getMilliseconds()).toBe(72);
});
it('should return the value of the moment seconds', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getSeconds()).toBe(2);
});
it('should return the value of the moment minutes', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getMinutes()).toBe(51);
});
it('should return the value of the moment hours', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getHours()).toBe(16);
});
it('should return the value of the moment day', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getDay()).toBe(1);
});
it('should return the value of the moment date', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getDate()).toBe(17);
});
it('should return the value of the moment month', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getMonth()).toBe(8);
moment.setMonth(0);
expect(moment.getMonth()).toBe(0);
});
it('should return the value of the moment year', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getYear()).toBe(2012);
});
});
// Assumes being run in NYC for now
describe('Moment get functions in UTC', function () { // returns values of a Moment
it('should return the value of the moment milliseconds in UTC', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getMilliseconds({ utc : true })).toBe(72);
});
it('should return the value of the moment seconds in UTC', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getSeconds({ utc : true })).toBe(2);
});
it('should return the value of the moment minutes in UTC', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getMinutes({ utc : true })).toBe(51);
});
it('should return the value of the moment hours in UTC', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getHours({ utc : true })).toBe(20);
});
it('should return the value of the moment day in UTC', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getDay({ utc : true })).toBe(1);
});
it('should return the value of the moment date in UTC', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getDate({ utc : true })).toBe(17);
});
it('should return the value of the moment month in UTC', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getMonth({ utc : true })).toBe(8);
var moment2 = new u.Moment(1330573123213);
expect(moment2.getMonth()).toBe(1);
expect(moment2.getMonth({ utc : true })).toBe(2);
});
it('should return the value of the moment year in UTC', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getYear({ utc : true })).toBe(2012);
var moment2 = new u.Moment(1357015023213);
expect(moment2.getYear()).toBe(2012);
expect(moment2.getYear({utc : true })).toBe(2013);
});
});
describe('Moment isLeapYear', function () { // returns Boolean
it('should return whether the given moment is in a leap year', function () { // with/without UTC?
var moment = new u.Moment();
moment.setYear(2012);
expect(moment.isLeapYear()).toBe(true);
moment.setYear(2013);
expect(moment.isLeapYear()).toBe(false);
});
});
describe('Moment isDst', function () { // returns Boolean
it('should return whether the given moment is in DST', function () {
var moment = new u.Moment(1347915062072);
expect(moment.isDst()).toBe(true);
moment.setMonth(11);
expect(moment.isDst()).toBe(false);
});
});
describe('Moment getTimezoneOffset', function () { // returns Number? (min vs. hours?)
// Disabling because this won't always be run in NYC
xit('should return the timezone offset for the given moment', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getTimezoneOffset()).toBe(240);
});
});
describe('Moment getDaysInMonth', function () { // returns Number
it('should return the number of days in the month of the given moment', function () {
var moment = new u.Moment();
moment.setMonth(8);
expect(moment.getDaysInMonth()).toBe(30);
moment.setMonth(1);
expect(moment.getDaysInMonth()).toBe(29);
moment.setMonth(11);
expect(moment.getDaysInMonth()).toBe(31);
});
});
describe('Moment chaining', function () {
it('should allow setters to be chained', function () {
var moment = new u.Moment();
moment.setMonth(2).setYear(2008).setMinutes(23).setToEndOf('hour');
expect(moment.getMinutes()).toBe(59);
expect(moment.getYear()).toBe(2008);
expect(moment.getMonth()).toBe(2);
});
});
describe('Duration', function () { // returns a new Duration
it('should create a representation of a duration of time', function () {
var duration = new u.Duration(10000);
expect(typeof duration._duration.humanize).toBe('function');
});
it('should allow a duration to be cloned', function () {
var duration1 = new u.Duration(10000);
var duration2 = duration1.clone();
expect(duration1).not.toBe(duration2);
expect(duration1.getAsMilliseconds()).toBe(duration2.getAsMilliseconds());
});
it('should create a duration from an ISO-8601 string with time and period', function () {
var duration1 = new u.Duration('P1Y3M20DT07H23M30S');
var duration2 = new u.Duration('P3DT12M34S');
expect(duration1.getMinutes()).toBe(23);
expect(duration1.getAsMinutes()).toBe(677243.5);
expect(duration2.getMinutes()).toBe(12);
expect(duration2.getSeconds()).toBe(34);
expect(duration2.getDays()).toBe(3);
});
it('should create a duration from an ISO-8601 string with time and period and extra spaces', function () {
var duration1 = new u.Duration('P 1Y 3M 20D T 7H 23M 30S');
expect(duration1.getMinutes()).toBe(23);
expect(duration1.getAsMinutes()).toBe(677243.5);
});
it('should create a duration from an ISO-8601 string with time only', function () {
var duration1 = new u.Duration('PT22H13M45S');
var duration2 = new u.Duration('PT34M');
expect(duration1.getMinutes()).toBe(13);
expect(duration1.getAsMinutes()).toBe(1333.75);
expect(duration2.getMinutes()).toBe(34);
expect(duration2.getHours()).toBe(0);
expect(duration2.getAsMinutes()).toBe(34);
});
it('should create a duration from an ISO-8601 string with period only', function () {
var duration1 = new u.Duration('P2Y10M28D');
var duration2 = new u.Duration('P3M10D');
expect(duration1.getMinutes()).toBe(0);
expect(duration1.getMonths()).toBe(10);
expect(duration1.getDays()).toBe(28);
expect(duration1.getAsDays()).toBe(1048);
expect(duration2.getDays()).toBe(10);
expect(duration2.getMonths()).toBe(3);
expect(duration2.getAsDays()).toBe(100);
});
});
describe('Duration get functions', function () { // returns values of a Duration
it('should get the value of the duration milliseconds', function () {
var duration = new u.Duration(600800);
expect(duration.getMilliseconds()).toBe(800);
});
it('should get the value of the duration seconds', function () {
var duration = new u.Duration(601800);
expect(duration.getSeconds()).toBe(1);
var duration2 = new u.Duration(1000 * 67);
expect(duration2.getSeconds()).toBe(7);
});
it('should get the value of the duration minutes', function () {
var duration = new u.Duration(1000 * 60 * 10);
expect(duration.getMinutes()).toBe(10);
var duration2 = new u.Duration(1000 * 60 * 65);
expect(duration2.getMinutes()).toBe(5);
});
it('should get the value of the duration hours', function () {
var duration = new u.Duration(1000 * 60 * 60);
expect(duration.getHours()).toBe(1);
var duration2 = new u.Duration(1000 * 60 * 125);
expect(duration2.getHours()).toBe(2);
});
it('should get the value of the duration days', function () {
var duration = new u.Duration(1000 * 60 * 60 * 24);
expect(duration.getDays()).toBe(1);
var duration2 = new u.Duration(1000 * 60 * 60 * 100);
expect(duration2.getDays()).toBe(4);
});
it('should get the value of the duration months', function () {
var duration = new u.Duration(1000 * 60 * 60 * 24 * 30);
expect(duration.getMonths()).toBe(1);
var duration2 = new u.Duration(1000 * 60 * 60 * 24 * 75);
expect(duration2.getMonths()).toBe(2);
});
it('should get the value of the duration years', function () {
var duration = new u.Duration(1000 * 60 * 60 * 24 * 366);
expect(duration.getYears()).toBe(1);
var duration2 = new u.Duration(1000 * 60 * 60 * 24 * 800);
expect(duration2.getYears()).toBe(2);
});
});
describe('Duration get as functions', function () { // returns values of a Duration
it('should get the value of the duration as milliseconds', function () {
var duration = new u.Duration(2200);
expect(duration.getAsMilliseconds()).toBe(2200);
});
it('should get the value of the duration as seconds', function () {
var duration = new u.Duration(2200);
expect(duration.getAsSeconds()).toBe(2.2);
});
it('should get the value of the duration as minutes', function () {
var duration = new u.Duration(1000 * 60 * 5);
expect(duration.getAsMinutes()).toBe(5);
var duration2 = new u.Duration(1000 * 60 * 5.4);
expect(duration2.getAsMinutes()).toBe(5.4);
});
it('should get the value of the duration as hours', function () {
var duration = new u.Duration(1000 * 60 * 90);
expect(duration.getAsHours()).toBe(1.5);
});
it('should get the value of the duration as days', function () {
var duration = new u.Duration(1000 * 60 * 60 * 24);
expect(duration.getAsDays()).toBe(1);
var duration2 = new u.Duration(1000 * 60 * 60 * 51);
expect(duration2.getAsDays()).toBe(2.125);
});
it('should get the value of the duration months', function () {
var duration = new u.Duration(1000 * 60 * 60 * 24 * 30);
expect(duration.getAsMonths()).toBe(1);
var duration2 = new u.Duration(1000 * 60 * 60 * 24 * 45);
expect(duration2.getAsMonths()).toBe(1.5);
});
it('should get the value of the duration as years', function () {
var duration = new u.Duration(1000 * 60 * 60 * 24 * 365);
expect(duration.getAsYears()).toBe(1);
var duration2 = new u.Duration(1000 * 60 * 60 * 24 * 438);
expect(duration2.getAsYears()).toBe(1.2);
});
});
describe('addDurations', function () { // returns a new Duration
it('should add two Durations, returning a new Duration', function () {
var duration1 = new u.Duration(10000);
var duration2 = new u.Duration(20000);
var duration3 = new u.Duration(30000);
expect(u.addDurations(duration1, duration2)).toEqual(duration3);
});
it('should allow argument overloading', function () {
var duration = new u.Duration(2500);
expect(u.addDurations(1000, 1500)).toEqual(duration);
expect(u.addDurations(new u.Duration(1000), 1500)).toEqual(duration);
expect(u.addDurations(1000, new u.Duration(1500))).toEqual(duration);
});
});
describe('subtractDurations', function () { // returns a new Duration
it('should subtract two Durations, returning a new Duration which may be negative', function () {
var duration1 = new u.Duration(30000);
var duration2 = new u.Duration(10000);
var duration3 = new u.Duration(20000);
expect(u.subtractDurations(duration1, duration2)).toEqual(duration3);
var duration4 = new u.Duration(10000);
var duration5 = new u.Duration(30000);
var duration6 = new u.Duration(-20000);
expect(u.subtractDurations(duration4, duration5)).toEqual(duration6);
});
it('should allow argument overloading', function () {
var duration = new u.Duration(2500);
expect(u.subtractDurations(4000, 1500)).toEqual(duration);
expect(u.subtractDurations(new u.Duration(4000), 1500)).toEqual(duration);
expect(u.subtractDurations(4000, new u.Duration(1500))).toEqual(duration);
});
});
describe('diffDurations', function () { // returns a new Duration
it('should find the difference between two durations, as an absolute number Duration', function () {
var duration1 = new u.Duration(35000);
var duration2 = new u.Duration(-30000);
var duration3 = new u.Duration(65000);
expect(u.diffDurations(duration1, duration2)).toEqual(duration3);
expect(u.diffDurations(duration2, duration1)).toEqual(duration3);
var duration4 = new u.Duration(70000);
var duration5 = new u.Duration(80000);
var duration6 = new u.Duration(10000);
expect(u.diffDurations(duration4, duration5)).toEqual(duration6);
expect(u.diffDurations(duration5, duration4)).toEqual(duration6);
});
it('should allow argument overloading', function () {
var diff = new u.Duration(5000);
expect(u.diffDurations(4000, 'PT 9S')).toEqual(diff);
expect(u.diffDurations(new u.Duration(4000), -1000)).toEqual(diff);
});
});
describe('addToMoment', function () { // returns a new Moment
it('should add a duration to a moment, returning a new Moment', function () {
var moment1 = new u.Moment(1347915062072);
var duration1 = new u.Duration(1000 * 60 * 60 * 24);
expect(u.addToMoment(moment1, duration1).getDate()).toBe(18);
expect(u.addToMoment(moment1, duration1).getDate()).toBe(18); // two times to ensure it's not mutating the original
var moment2 = new u.Moment(1347915062072);
var duration2 = new u.Duration(-1000 * 60 * 60 * 24);
expect(u.addToMoment(moment2, duration2).getDate()).toBe(16);
});
it('should allow argument overloading', function () {
expect(u.addToMoment(1347915062072, 1000 * 60 * 60 * 24).getDate()).toBe(18);
});
});
describe('subtractFromMoment', function () { // returns a new Moment
it('should subtract a duration from a moment, returning a new Moment', function () {
var moment1 = new u.Moment(1347915062072);
var duration1 = new u.Duration(1000 * 60 * 60 * 24);
expect(u.subtractFromMoment(moment1, duration1).getDate()).toBe(16);
expect(u.subtractFromMoment(moment1, duration1).getDate()).toBe(16); // two times to ensure it's not mutating the original
var moment2 = new u.Moment(1347915062072);
var duration2 = new u.Duration(-1000 * 60 * 60 * 24);
expect(u.subtractFromMoment(moment2, duration2).getDate()).toBe(18);
});
it('should allow argument overloading', function () {
expect(u.subtractFromMoment(1347915062072, 1000 * 60 * 60 * 24).getDate()).toBe(16);
});
});
describe('diffMoments', function () { // returns a new Duration
it('should find the difference between two moments, expressed as a Duration', function () {
var moment1 = new u.Moment(1347915062072);
var moment2 = new u.Moment(1348001462073);
var duration1 = new u.Duration((-1000 * 60 * 60 * 24) - 1);
expect(u.diffMoments(moment1, moment2)).toEqual(duration1);
});
// TODO: Because of moment.js, the commented out test is failing; internal objects aren't equal
it('should allow argument overloading', function () {
var duration1 = new u.Duration('P3D');
//expect(u.diffMoments('2012-01-04', '2012-01-01')).toEqual(duration1);
expect(u.diffMoments('2012-01-01', '2012-01-04').getAsDays()).toEqual(-3);
expect(u.diffMoments('2012-01-04', '2012-01-01').getAsDays()).toEqual(duration1.getAsDays());
expect(u.diffMoments('2012-01-04', '2012-01-01').getAsMilliseconds()).toEqual(duration1.getAsMilliseconds());
expect(u.diffMoments('2012-01-04', '2012-01-01').getMilliseconds()).toEqual(duration1.getMilliseconds());
});
});
describe('Moment add', function () { // returns the original Moment (m.add(Duration))
it('should add a Duration to a Moment, returning the same Moment instance', function () {
var moment = new u.Moment(1347915062072);
var duration = new u.Duration(10);
expect(moment.add(duration).toDate().valueOf()).toBe(1347915062082);
});
it('should return the same Moment instance, not the momentjs representation', function () {
var moment = new u.Moment(1347915062072);
var duration = new u.Duration(10);
expect(moment.add(duration).getTimezoneOffset).toEqual(jasmine.any(Function));
});
it('should allow argument overloading', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getSeconds()).toBe(2);
moment.add(1000);
expect(moment.getSeconds()).toBe(3);
});
});
describe('Moment subtract', function () { // returns the original Moment
it('should subtract a Duration from a Moment, returning the same Moment instance', function () {
var moment = new u.Moment(1347915062072);
var duration = new u.Duration(10);
expect(moment.subtract(duration).toDate().valueOf()).toBe(1347915062062);
});
it('should return the same Moment instance, not the momentjs representation', function () {
var moment = new u.Moment(1347915062072);
var duration = new u.Duration(10);
expect(moment.subtract(duration).getTimezoneOffset).toEqual(jasmine.any(Function));
});
it('should allow argument overloading', function () {
var moment = new u.Moment(1347915062072);
expect(moment.getSeconds()).toBe(2);
moment.subtract(1000);
expect(moment.getSeconds()).toBe(1);
});
});
describe('Duration add', function () { // returns the original Duration
it('should add a Duration to a Duration, returning the original Duration instance', function () {
var duration1 = new u.Duration(10000);
var duration2 = new u.Duration(20000);
expect(duration1.add(duration2).getAsMilliseconds()).toBe(30000);
// duration1 is now 30000
expect(duration2.add(duration1).getAsMilliseconds()).toBe(50000);
});
it('should allow argument overloading', function () {
var duration = new u.Duration(5500);
duration.add(1000).add('PT 1S');
expect(duration.getAsMilliseconds()).toBe(7500);
});
});
describe('Duration subtract', function () { // returns the original Duration
it('should subtract a Duration from a Duration, returning the original Duration instance', function () {
var duration1 = new u.Duration(10000);
var duration2 = new u.Duration(20000);
expect(duration1.subtract(duration2).getAsMilliseconds()).toBe(-10000);
// duration1 is now -10000
expect(duration2.subtract(duration1).getAsMilliseconds()).toBe(30000);
});
it('should allow argument overloading', function () {
var duration = new u.Duration(5500);
duration.subtract(1000).subtract('PT 2S');
expect(duration.getAsMilliseconds()).toBe(2500);
});
});
// Only here for testing by exposing this method publicly; method is not meant to be exposed.
xdescribe('Mutate Duration', function () {
it('should mutate all properties in a Duration object', function () {
var duration1 = new u.Duration(982738947892374);
u.mutateDuration(duration1, 1234567898765);
expect(Math.ceil(duration1.getAsDays())).toBe(14289);
expect(duration1.getDays()).toBe(8);
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.