/******************************************************************************* * Copyright (c) 2004 Vlad Dumitrescu and others. All rights reserved. This program and * the accompanying materials are made available under the terms of the Eclipse Public * License v1.0 which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: Vlad Dumitrescu *******************************************************************************/ package org.erlide.util; import org.erlide.util.erlang.OtpBindings; import org.erlide.util.erlang.OtpErlang; import org.erlide.util.erlang.OtpParser; import org.erlide.util.erlang.OtpParserException; import org.junit.Assert; import org.junit.Test; import com.ericsson.otp.erlang.OtpErlangAtom; import com.ericsson.otp.erlang.OtpErlangLong; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangString; /** * * * @author Vlad Dumitrescu */ public class PatternMatchTest { private final OtpParser termParser = OtpErlang.getTermParser(); @Test public void testFormatParser_simple_1() throws Exception { final OtpErlangObject value = OtpErlang.format("~a", "hej"); final OtpErlangObject expected = OtpErlang.parse("hej"); Assert.assertEquals(expected, value); } @Test public void testFormatParser_simple_2() throws Exception { final OtpErlangObject value = OtpErlang.format("~s", "hej"); final OtpErlangObject expected = OtpErlang.parse("\"hej\""); Assert.assertEquals(expected, value); } @Test public void testFormatParser_simple_3() throws Exception { final OtpErlangObject value = OtpErlang.format("~x"); final OtpErlangObject expected = OtpErlang.parse("~x"); Assert.assertEquals(expected, value); } @Test public void testFormatParser_list() throws Exception { final OtpErlangObject value = OtpErlang.format("[~a,2,~a]", "hej", "brr"); final OtpErlangObject expected = OtpErlang.parse("[hej,2,brr]"); Assert.assertEquals(expected, value); } @Test public void testFormatParser_tuple() throws Exception { final OtpErlangObject value = OtpErlang.format("{~a,2,~a}", "hej", "brr"); final OtpErlangObject expected = OtpErlang.parse("{hej,2,brr}"); Assert.assertEquals(expected, value); } @Test public void testFormatParser_full() throws Exception { final OtpErlangObject value = OtpErlang.format("[~a,{2,~a},5]", "hej", "brr"); final OtpErlangObject expected = OtpErlang.parse("[hej,{2,brr},5]"); Assert.assertEquals(expected, value); } @Test public void testMatch_novar() throws Exception { final OtpErlangObject p = OtpErlang.parse("[a, {b}]"); final OtpErlangObject t1 = OtpErlang.parse("[a, {b}]"); final OtpBindings r = OtpErlang.match(p, t1); Assert.assertNotNull(r); } @Test public void testMatch() throws Exception { final OtpBindings r = OtpErlang.match("[W, V]", "[a, b]"); Assert.assertEquals(r.get("W"), new OtpErlangAtom("a")); Assert.assertEquals(r.get("V"), new OtpErlangAtom("b")); } @Test public void testMatch_0() throws Exception { final OtpBindings b = new OtpBindings(); b.put("W", new OtpErlangAtom("a")); final OtpBindings r = OtpErlang.match("[W, V]", "[a, b]", b); Assert.assertNotNull(r); Assert.assertEquals(r.get("V"), new OtpErlangAtom("b")); } @Test public void testMatch_1() throws Exception { final OtpBindings r = OtpErlang.match("[W, V]", "[\"a\", {[1, 2]}]"); Assert.assertEquals(r.get("W"), new OtpErlangString("a")); Assert.assertEquals(r.get("V"), OtpErlang.parse("{[1, 2]}")); } @Test public void testMatch_same() throws Exception { final OtpBindings r = OtpErlang.match("[W, {V}]", "[a, {a}]"); Assert.assertEquals(r.get("W"), new OtpErlangAtom("a")); } @Test public void testMatch_any() throws Exception { final OtpBindings r = OtpErlang.match("[_, {_}]", "[a, {b}]"); Assert.assertNotNull(r); } @Test public void testMatch_same_fail() throws Exception { final OtpBindings r = OtpErlang.match("[W, {W}]", "[a, {b}]"); Assert.assertNull(r); } @Test public void testMatch_sig_a() throws Exception { final OtpBindings r = OtpErlang.match("W:a", "zzz"); Assert.assertEquals(r.get("W"), new OtpErlangAtom("zzz")); } @Test public void testMatch_sig_i() throws Exception { final OtpBindings r = OtpErlang.match("W:i", "222"); Assert.assertEquals(r.get("W"), new OtpErlangLong(222)); } @Test public void testMatch_sig_fail() throws Exception { final OtpBindings r = OtpErlang.match("W:i", "zzz"); Assert.assertNull(r); } @Test public void testMatch_ellipsis_1() throws Exception { final OtpErlangObject r = termParser.parse("[x|_]"); Assert.assertNotNull(r); } @Test public void testMatch_ellipsis_2() throws Exception { final OtpBindings r = OtpErlang.match("[X | T]", "[x,y,z]"); Assert.assertNotNull(r); Assert.assertEquals(new OtpErlangAtom("x"), r.get("X")); Assert.assertEquals(termParser.parse("[y,z]"), r.get("T")); } @Test() public void testMatch_ellipsis_4() throws Exception { final OtpBindings r = OtpErlang.match("[X | y]", "[x,y,z]"); Assert.assertNull(r); } @Test(expected = OtpParserException.class) public void testMatch_ellipsis_5() throws Exception { OtpErlang.match("[X | Y, Z]", "[x,y,z]"); } @Test public void testMatch_t() throws Exception { final OtpBindings r = OtpErlang.match("[W:a, V:i]", "[a, 1]"); Assert.assertEquals(r.getAs("W", String.class), "a"); Assert.assertEquals(r.getAs("V", Integer.class), Integer.valueOf(1)); } }