/* * Copyright 2007 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.zxing.client.result; import com.google.zxing.BarcodeFormat; import com.google.zxing.RXingResult; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Locale; import java.util.TimeZone; /** * Tests {@link CalendarParsedRXingResult}. * * @author Sean Owen */ public final class CalendarParsedRXingResultTestCase extends Assert { private static final double EPSILON = 1.0E-10; private static DateFormat makeGMTFormat() { DateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.ENGLISH); format.setTimeZone(TimeZone.getTimeZone("GMT")); return format; } @Before public void setUp() { Locale.setDefault(Locale.ENGLISH); TimeZone.setDefault(TimeZone.getTimeZone("GMT")); } @Test public void testStartEnd() { doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "DTSTART:20080504T123456Z\r\n" + "DTEND:20080505T234555Z\r\n" + "END:VEVENT\r\nEND:VCALENDAR", null, null, null, "20080504T123456Z", "20080505T234555Z"); } @Test public void testNoVCalendar() { doTest( "BEGIN:VEVENT\r\n" + "DTSTART:20080504T123456Z\r\n" + "DTEND:20080505T234555Z\r\n" + "END:VEVENT", null, null, null, "20080504T123456Z", "20080505T234555Z"); } @Test public void testStart() { doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "DTSTART:20080504T123456Z\r\n" + "END:VEVENT\r\nEND:VCALENDAR", null, null, null, "20080504T123456Z", null); } @Test public void testDuration() { doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "DTSTART:20080504T123456Z\r\n" + "DURATION:P1D\r\n" + "END:VEVENT\r\nEND:VCALENDAR", null, null, null, "20080504T123456Z", "20080505T123456Z"); doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "DTSTART:20080504T123456Z\r\n" + "DURATION:P1DT2H3M4S\r\n" + "END:VEVENT\r\nEND:VCALENDAR", null, null, null, "20080504T123456Z", "20080505T143800Z"); } @Test public void testSummary() { doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "SUMMARY:foo\r\n" + "DTSTART:20080504T123456Z\r\n" + "END:VEVENT\r\nEND:VCALENDAR", null, "foo", null, "20080504T123456Z", null); } @Test public void testLocation() { doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "LOCATION:Miami\r\n" + "DTSTART:20080504T123456Z\r\n" + "END:VEVENT\r\nEND:VCALENDAR", null, null, "Miami", "20080504T123456Z", null); } @Test public void testDescription() { doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "DTSTART:20080504T123456Z\r\n" + "DESCRIPTION:This is a test\r\n" + "END:VEVENT\r\nEND:VCALENDAR", "This is a test", null, null, "20080504T123456Z", null); doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "DTSTART:20080504T123456Z\r\n" + "DESCRIPTION:This is a test\r\n\t with a continuation\r\n" + "END:VEVENT\r\nEND:VCALENDAR", "This is a test with a continuation", null, null, "20080504T123456Z", null); } @Test public void testGeo() { doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "DTSTART:20080504T123456Z\r\n" + "GEO:-12.345;-45.678\r\n" + "END:VEVENT\r\nEND:VCALENDAR", null, null, null, "20080504T123456Z", null, null, null, -12.345, -45.678); } @Test public void testBadGeo() { // Not parsed as VEVENT RXingResult fakeRXingResult = new RXingResult("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "GEO:-12.345\r\n" + "END:VEVENT\r\nEND:VCALENDAR", null, null, BarcodeFormat.QR_CODE); ParsedRXingResult result = RXingResultParser.parseRXingResult(fakeRXingResult); assertSame(ParsedRXingResultType.TEXT, result.getType()); } @Test public void testOrganizer() { doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "DTSTART:20080504T123456Z\r\n" + "ORGANIZER:mailto:bob@example.org\r\n" + "END:VEVENT\r\nEND:VCALENDAR", null, null, null, "20080504T123456Z", null, "bob@example.org", null, Double.NaN, Double.NaN); } @Test public void testAttendees() { doTest( "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + "DTSTART:20080504T123456Z\r\n" + "ATTENDEE:mailto:bob@example.org\r\n" + "ATTENDEE:mailto:alice@example.org\r\n" + "END:VEVENT\r\nEND:VCALENDAR", null, null, null, "20080504T123456Z", null, null, new String[] {"bob@example.org", "alice@example.org"}, Double.NaN, Double.NaN); } @Test public void testVEventEscapes() { doTest("BEGIN:VEVENT\n" + "CREATED:20111109T110351Z\n" + "LAST-MODIFIED:20111109T170034Z\n" + "DTSTAMP:20111109T170034Z\n" + "UID:0f6d14ef-6cb7-4484-9080-61447ccdf9c2\n" + "SUMMARY:Summary line\n" + "CATEGORIES:Private\n" + "DTSTART;TZID=Europe/Vienna:20111110T110000\n" + "DTEND;TZID=Europe/Vienna:20111110T120000\n" + "LOCATION:Location\\, with\\, escaped\\, commas\n" + "DESCRIPTION:Meeting with a friend\\nlook at homepage first\\n\\n\n" + " \\n\n" + "SEQUENCE:1\n" + "X-MOZ-GENERATION:1\n" + "END:VEVENT", "Meeting with a friend\nlook at homepage first\n\n\n \n", "Summary line", "Location, with, escaped, commas", "20111110T110000Z", "20111110T120000Z"); } @Test public void testAllDayValueDate() { doTest("BEGIN:VEVENT\n" + "DTSTART;VALUE=DATE:20111110\n" + "DTEND;VALUE=DATE:20111110\n" + "END:VEVENT", null, null, null, "20111110T000000Z", "20111110T000000Z"); } private static void doTest(String contents, String description, String summary, String location, String startString, String endString) { doTest(contents, description, summary, location, startString, endString, null, null, Double.NaN, Double.NaN); } private static void doTest(String contents, String description, String summary, String location, String startString, String endString, String organizer, String[] attendees, double latitude, double longitude) { RXingResult fakeRXingResult = new RXingResult(contents, null, null, BarcodeFormat.QR_CODE); ParsedRXingResult result = RXingResultParser.parseRXingResult(fakeRXingResult); assertSame(ParsedRXingResultType.CALENDAR, result.getType()); CalendarParsedRXingResult calRXingResult = (CalendarParsedRXingResult) result; assertEquals(description, calRXingResult.getDescription()); assertEquals(summary, calRXingResult.getSummary()); assertEquals(location, calRXingResult.getLocation()); DateFormat dateFormat = makeGMTFormat(); assertEquals(startString, dateFormat.format(calRXingResult.getStartTimestamp())); assertEquals(endString, calRXingResult.getEndTimestamp() < 0L ? null : dateFormat.format(calRXingResult.getEndTimestamp())); assertEquals(organizer, calRXingResult.getOrganizer()); assertArrayEquals(attendees, calRXingResult.getAttendees()); assertEqualOrNaN(latitude, calRXingResult.getLatitude()); assertEqualOrNaN(longitude, calRXingResult.getLongitude()); } private static void assertEqualOrNaN(double expected, double actual) { if (Double.isNaN(expected)) { assertTrue(Double.isNaN(actual)); } else { assertEquals(expected, actual, EPSILON); } } }