/* * 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.util.Calendar; import java.util.Locale; import java.util.TimeZone; /** * Tests {@link ParsedRXingResult}. * * @author Sean Owen * @author dswitkin@google.com (Daniel Switkin) */ public final class ParsedReaderRXingResultTestCase extends Assert { @Before public void setUp() { Locale.setDefault(Locale.ENGLISH); TimeZone.setDefault(TimeZone.getTimeZone("GMT")); } @Test public void testTextType() { doTestRXingResult("", "", ParsedRXingResultType.TEXT); doTestRXingResult("foo", "foo", ParsedRXingResultType.TEXT); doTestRXingResult("Hi.", "Hi.", ParsedRXingResultType.TEXT); doTestRXingResult("This is a test", "This is a test", ParsedRXingResultType.TEXT); doTestRXingResult("This is a test\nwith newlines", "This is a test\nwith newlines", ParsedRXingResultType.TEXT); doTestRXingResult("This: a test with lots of @ nearly-random punctuation! No? OK then.", "This: a test with lots of @ nearly-random punctuation! No? OK then.", ParsedRXingResultType.TEXT); } @Test public void testBookmarkType() { doTestRXingResult("MEBKM:URL:google.com;;", "http://google.com", ParsedRXingResultType.URI); doTestRXingResult("MEBKM:URL:google.com;TITLE:Google;;", "Google\nhttp://google.com", ParsedRXingResultType.URI); doTestRXingResult("MEBKM:TITLE:Google;URL:google.com;;", "Google\nhttp://google.com", ParsedRXingResultType.URI); doTestRXingResult("MEBKM:URL:http://google.com;;", "http://google.com", ParsedRXingResultType.URI); doTestRXingResult("MEBKM:URL:HTTPS://google.com;;", "HTTPS://google.com", ParsedRXingResultType.URI); } @Test public void testURLTOType() { doTestRXingResult("urlto:foo:bar.com", "foo\nhttp://bar.com", ParsedRXingResultType.URI); doTestRXingResult("URLTO:foo:bar.com", "foo\nhttp://bar.com", ParsedRXingResultType.URI); doTestRXingResult("URLTO::bar.com", "http://bar.com", ParsedRXingResultType.URI); doTestRXingResult("URLTO::http://bar.com", "http://bar.com", ParsedRXingResultType.URI); } @Test public void testEmailType() { doTestRXingResult("MATMSG:TO:srowen@example.org;;", "srowen@example.org", ParsedRXingResultType.EMAIL_ADDRESS); doTestRXingResult("MATMSG:TO:srowen@example.org;SUB:Stuff;;", "srowen@example.org\nStuff", ParsedRXingResultType.EMAIL_ADDRESS); doTestRXingResult("MATMSG:TO:srowen@example.org;SUB:Stuff;BODY:This is some text;;", "srowen@example.org\nStuff\nThis is some text", ParsedRXingResultType.EMAIL_ADDRESS); doTestRXingResult("MATMSG:SUB:Stuff;BODY:This is some text;TO:srowen@example.org;;", "srowen@example.org\nStuff\nThis is some text", ParsedRXingResultType.EMAIL_ADDRESS); doTestRXingResult("TO:srowen@example.org;SUB:Stuff;BODY:This is some text;;", "TO:srowen@example.org;SUB:Stuff;BODY:This is some text;;", ParsedRXingResultType.TEXT); } @Test public void testEmailAddressType() { doTestRXingResult("srowen@example.org", "srowen@example.org", ParsedRXingResultType.EMAIL_ADDRESS); doTestRXingResult("mailto:srowen@example.org", "srowen@example.org", ParsedRXingResultType.EMAIL_ADDRESS); doTestRXingResult("MAILTO:srowen@example.org", "srowen@example.org", ParsedRXingResultType.EMAIL_ADDRESS); doTestRXingResult("srowen@example", "srowen@example", ParsedRXingResultType.EMAIL_ADDRESS); doTestRXingResult("srowen", "srowen", ParsedRXingResultType.TEXT); doTestRXingResult("Let's meet @ 2", "Let's meet @ 2", ParsedRXingResultType.TEXT); } @Test public void testAddressBookType() { doTestRXingResult("MECARD:N:Sean Owen;;", "Sean Owen", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("MECARD:TEL:+12125551212;N:Sean Owen;;", "Sean Owen\n+12125551212", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("MECARD:TEL:+12125551212;N:Sean Owen;URL:google.com;;", "Sean Owen\n+12125551212\ngoogle.com", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("MECARD:TEL:+12125551212;N:Sean Owen;URL:google.com;EMAIL:srowen@example.org;", "Sean Owen\n+12125551212\nsrowen@example.org\ngoogle.com", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("MECARD:ADR:76 9th Ave;N:Sean Owen;URL:google.com;EMAIL:srowen@example.org;", "Sean Owen\n76 9th Ave\nsrowen@example.org\ngoogle.com", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("MECARD:BDAY:19760520;N:Sean Owen;URL:google.com;EMAIL:srowen@example.org;", "Sean Owen\nsrowen@example.org\ngoogle.com\n19760520", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("MECARD:ORG:Google;N:Sean Owen;URL:google.com;EMAIL:srowen@example.org;", "Sean Owen\nGoogle\nsrowen@example.org\ngoogle.com", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("MECARD:NOTE:ZXing Team;N:Sean Owen;URL:google.com;EMAIL:srowen@example.org;", "Sean Owen\nsrowen@example.org\ngoogle.com\nZXing Team", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("N:Sean Owen;TEL:+12125551212;;", "N:Sean Owen;TEL:+12125551212;;", ParsedRXingResultType.TEXT); } @Test public void testAddressBookAUType() { doTestRXingResult("MEMORY:\r\n", "", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("MEMORY:foo\r\nNAME1:Sean\r\n", "Sean\nfoo", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("TEL1:+12125551212\r\nMEMORY:\r\n", "+12125551212", ParsedRXingResultType.ADDRESSBOOK); } @Test public void testBizcard() { doTestRXingResult("BIZCARD:N:Sean;X:Owen;C:Google;A:123 Main St;M:+12225551212;E:srowen@example.org;", "Sean Owen\nGoogle\n123 Main St\n+12225551212\nsrowen@example.org", ParsedRXingResultType.ADDRESSBOOK); } @Test public void testUPCA() { doTestRXingResult("123456789012", "123456789012", ParsedRXingResultType.PRODUCT, BarcodeFormat.UPC_A); doTestRXingResult("1234567890123", "1234567890123", ParsedRXingResultType.PRODUCT, BarcodeFormat.UPC_A); doTestRXingResult("12345678901", "12345678901", ParsedRXingResultType.TEXT); } @Test public void testUPCE() { doTestRXingResult("01234565", "01234565", ParsedRXingResultType.PRODUCT, BarcodeFormat.UPC_E); } @Test public void testEAN() { doTestRXingResult("00393157", "00393157", ParsedRXingResultType.PRODUCT, BarcodeFormat.EAN_8); doTestRXingResult("00393158", "00393158", ParsedRXingResultType.TEXT); doTestRXingResult("5051140178499", "5051140178499", ParsedRXingResultType.PRODUCT, BarcodeFormat.EAN_13); doTestRXingResult("5051140178490", "5051140178490", ParsedRXingResultType.TEXT); } @Test public void testISBN() { doTestRXingResult("9784567890123", "9784567890123", ParsedRXingResultType.ISBN, BarcodeFormat.EAN_13); doTestRXingResult("9794567890123", "9794567890123", ParsedRXingResultType.ISBN, BarcodeFormat.EAN_13); doTestRXingResult("97845678901", "97845678901", ParsedRXingResultType.TEXT); doTestRXingResult("97945678901", "97945678901", ParsedRXingResultType.TEXT); } @Test public void testURI() { doTestRXingResult("http://google.com", "http://google.com", ParsedRXingResultType.URI); doTestRXingResult("google.com", "http://google.com", ParsedRXingResultType.URI); doTestRXingResult("https://google.com", "https://google.com", ParsedRXingResultType.URI); doTestRXingResult("HTTP://google.com", "HTTP://google.com", ParsedRXingResultType.URI); doTestRXingResult("http://google.com/foobar", "http://google.com/foobar", ParsedRXingResultType.URI); doTestRXingResult("https://google.com:443/foobar", "https://google.com:443/foobar", ParsedRXingResultType.URI); doTestRXingResult("google.com:443", "http://google.com:443", ParsedRXingResultType.URI); doTestRXingResult("google.com:443/", "http://google.com:443/", ParsedRXingResultType.URI); doTestRXingResult("google.com:443/foobar", "http://google.com:443/foobar", ParsedRXingResultType.URI); doTestRXingResult("http://google.com:443/foobar", "http://google.com:443/foobar", ParsedRXingResultType.URI); doTestRXingResult("https://google.com:443/foobar", "https://google.com:443/foobar", ParsedRXingResultType.URI); doTestRXingResult("ftp://google.com/fake", "ftp://google.com/fake", ParsedRXingResultType.URI); doTestRXingResult("gopher://google.com/obsolete", "gopher://google.com/obsolete", ParsedRXingResultType.URI); } @Test public void testGeo() { doTestRXingResult("geo:1,2", "1.0, 2.0", ParsedRXingResultType.GEO); doTestRXingResult("GEO:1,2", "1.0, 2.0", ParsedRXingResultType.GEO); doTestRXingResult("geo:1,2,3", "1.0, 2.0, 3.0m", ParsedRXingResultType.GEO); doTestRXingResult("geo:80.33,-32.3344,3.35", "80.33, -32.3344, 3.35m", ParsedRXingResultType.GEO); doTestRXingResult("geo", "geo", ParsedRXingResultType.TEXT); doTestRXingResult("geography", "geography", ParsedRXingResultType.TEXT); } @Test public void testTel() { doTestRXingResult("tel:+15551212", "+15551212", ParsedRXingResultType.TEL); doTestRXingResult("TEL:+15551212", "+15551212", ParsedRXingResultType.TEL); doTestRXingResult("tel:212 555 1212", "212 555 1212", ParsedRXingResultType.TEL); doTestRXingResult("tel:2125551212", "2125551212", ParsedRXingResultType.TEL); doTestRXingResult("tel:212-555-1212", "212-555-1212", ParsedRXingResultType.TEL); doTestRXingResult("tel", "tel", ParsedRXingResultType.TEXT); doTestRXingResult("telephone", "telephone", ParsedRXingResultType.TEXT); } @Test public void testVCard() { doTestRXingResult("BEGIN:VCARD\r\nEND:VCARD", "", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("BEGIN:VCARD\r\nN:Owen;Sean\r\nEND:VCARD", "Sean Owen", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("BEGIN:VCARD\r\nVERSION:2.1\r\nN:Owen;Sean\r\nEND:VCARD", "Sean Owen", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("BEGIN:VCARD\r\nADR;HOME:123 Main St\r\nVERSION:2.1\r\nN:Owen;Sean\r\nEND:VCARD", "Sean Owen\n123 Main St", ParsedRXingResultType.ADDRESSBOOK); doTestRXingResult("BEGIN:VCARD", "", ParsedRXingResultType.ADDRESSBOOK); } @Test public void testVEvent() { // UTC times doTestRXingResult("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504T123456Z\r\n" + "DTEND:20080505T234555Z\r\nEND:VEVENT\r\nEND:VCALENDAR", "foo\n" + formatTime(2008, 5, 4, 12, 34, 56) + "\n" + formatTime(2008, 5, 5, 23, 45, 55), ParsedRXingResultType.CALENDAR); doTestRXingResult("BEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504T123456Z\r\n" + "DTEND:20080505T234555Z\r\nEND:VEVENT", "foo\n" + formatTime(2008, 5, 4, 12, 34, 56) + "\n" + formatTime(2008, 5, 5, 23, 45, 55), ParsedRXingResultType.CALENDAR); // Local times doTestRXingResult("BEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504T123456\r\n" + "DTEND:20080505T234555\r\nEND:VEVENT", "foo\n" + formatTime(2008, 5, 4, 12, 34, 56) + "\n" + formatTime(2008, 5, 5, 23, 45, 55), ParsedRXingResultType.CALENDAR); // Date only (all day event) doTestRXingResult("BEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504\r\n" + "DTEND:20080505\r\nEND:VEVENT", "foo\n" + formatDate(2008, 5, 4) + "\n" + formatDate(2008, 5, 5), ParsedRXingResultType.CALENDAR); // Start time only doTestRXingResult("BEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504T123456Z\r\nEND:VEVENT", "foo\n" + formatTime(2008, 5, 4, 12, 34, 56), ParsedRXingResultType.CALENDAR); doTestRXingResult("BEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504T123456\r\nEND:VEVENT", "foo\n" + formatTime(2008, 5, 4, 12, 34, 56), ParsedRXingResultType.CALENDAR); doTestRXingResult("BEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504\r\nEND:VEVENT", "foo\n" + formatDate(2008, 5, 4), ParsedRXingResultType.CALENDAR); doTestRXingResult("BEGIN:VEVENT\r\nDTEND:20080505T\r\nEND:VEVENT", "BEGIN:VEVENT\r\nDTEND:20080505T\r\nEND:VEVENT", ParsedRXingResultType.TEXT); // Yeah, it's OK that this is thought of as maybe a URI as long as it's not CALENDAR // Make sure illegal entries without newlines don't crash doTestRXingResult( "BEGIN:VEVENTSUMMARY:EventDTSTART:20081030T122030ZDTEND:20081030T132030ZEND:VEVENT", "BEGIN:VEVENTSUMMARY:EventDTSTART:20081030T122030ZDTEND:20081030T132030ZEND:VEVENT", ParsedRXingResultType.URI); } private static String formatDate(int year, int month, int day) { Calendar cal = Calendar.getInstance(); cal.clear(); cal.set(year, month - 1, day); return DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.US).format(cal.getTime()); } private static String formatTime(int year, int month, int day, int hour, int min, int sec) { Calendar cal = Calendar.getInstance(); cal.clear(); cal.set(year, month - 1, day, hour, min, sec); return DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.US).format(cal.getTime()); } @Test public void testSMS() { doTestRXingResult("sms:+15551212", "+15551212", ParsedRXingResultType.SMS); doTestRXingResult("SMS:+15551212", "+15551212", ParsedRXingResultType.SMS); doTestRXingResult("sms:+15551212;via=999333", "+15551212", ParsedRXingResultType.SMS); doTestRXingResult("sms:+15551212?subject=foo&body=bar", "+15551212\nfoo\nbar", ParsedRXingResultType.SMS); doTestRXingResult("sms:+15551212,+12124440101", "+15551212\n+12124440101", ParsedRXingResultType.SMS); } @Test public void testSMSTO() { doTestRXingResult("SMSTO:+15551212", "+15551212", ParsedRXingResultType.SMS); doTestRXingResult("smsto:+15551212", "+15551212", ParsedRXingResultType.SMS); doTestRXingResult("smsto:+15551212:subject", "+15551212\nsubject", ParsedRXingResultType.SMS); doTestRXingResult("smsto:+15551212:My message", "+15551212\nMy message", ParsedRXingResultType.SMS); // Need to handle question mark in the subject doTestRXingResult("smsto:+15551212:What's up?", "+15551212\nWhat's up?", ParsedRXingResultType.SMS); // Need to handle colon in the subject doTestRXingResult("smsto:+15551212:Directions: Do this", "+15551212\nDirections: Do this", ParsedRXingResultType.SMS); doTestRXingResult("smsto:212-555-1212:Here's a longer message. Should be fine.", "212-555-1212\nHere's a longer message. Should be fine.", ParsedRXingResultType.SMS); } @Test public void testMMS() { doTestRXingResult("mms:+15551212", "+15551212", ParsedRXingResultType.SMS); doTestRXingResult("MMS:+15551212", "+15551212", ParsedRXingResultType.SMS); doTestRXingResult("mms:+15551212;via=999333", "+15551212", ParsedRXingResultType.SMS); doTestRXingResult("mms:+15551212?subject=foo&body=bar", "+15551212\nfoo\nbar", ParsedRXingResultType.SMS); doTestRXingResult("mms:+15551212,+12124440101", "+15551212\n+12124440101", ParsedRXingResultType.SMS); } @Test public void testMMSTO() { doTestRXingResult("MMSTO:+15551212", "+15551212", ParsedRXingResultType.SMS); doTestRXingResult("mmsto:+15551212", "+15551212", ParsedRXingResultType.SMS); doTestRXingResult("mmsto:+15551212:subject", "+15551212\nsubject", ParsedRXingResultType.SMS); doTestRXingResult("mmsto:+15551212:My message", "+15551212\nMy message", ParsedRXingResultType.SMS); doTestRXingResult("mmsto:+15551212:What's up?", "+15551212\nWhat's up?", ParsedRXingResultType.SMS); doTestRXingResult("mmsto:+15551212:Directions: Do this", "+15551212\nDirections: Do this", ParsedRXingResultType.SMS); doTestRXingResult("mmsto:212-555-1212:Here's a longer message. Should be fine.", "212-555-1212\nHere's a longer message. Should be fine.", ParsedRXingResultType.SMS); } private static void doTestRXingResult(String contents, String goldenRXingResult, ParsedRXingResultType type) { doTestRXingResult(contents, goldenRXingResult, type, BarcodeFormat.QR_CODE); // QR code is arbitrary } private static void doTestRXingResult(String contents, String goldenRXingResult, ParsedRXingResultType type, BarcodeFormat format) { RXingResult fakeRXingResult = new RXingResult(contents, null, null, format); ParsedRXingResult result = RXingResultParser.parseRXingResult(fakeRXingResult); assertNotNull(result); assertSame(type, result.getType()); String displayRXingResult = result.getDisplayRXingResult(); assertEquals(goldenRXingResult, displayRXingResult); } }