2011-05-24 11 views
5

Estoy buscando una biblioteca Java que permita hacer coincidir una secuencia de objetos, potencialmente mezclando con matchers como los de hamcrest.Coincidencia de una corriente para ciertas condiciones

Idealmente me gustaría escribir una prueba que puede comprobar que un iterable contiene una secuencia que se vería como una expresión regular, pero para los objetos en lugar de cadenas de caracteres:

assertThat(myList).inSequence(oneOrMore(any()),zeroOrMore(equals(MyObject))); 

Mockito con verificación está cerca lo me gustaría, pero algunas simples comparadores se echa en falta (como zeroOrMore)

Alexandre

+1

No estoy seguro de por qué está etiquetado en regex. Parece una pregunta de Java para mí. – Mrchief

+0

Esta pregunta se refiere al formalismo de expresión regular aplicado a una secuencia de objetos en lugar de una secuencia de caracteres. –

Respuesta

4

solución más simple que puedo pensar es la construcción de una cadena con una carta para cada objeto, y luego usar expresiones regulares como de costumbre.

public boolean matchObjects() { 
    Object a = new Object(); 
    Object b = new Object(); 
    Object c = new Object(); 
    Object d = new Object(); 
    ArrayList<Object> arrayList = new ArrayList<Object>(); 
    arrayList.add(a); 
    arrayList.add(b); 
    arrayList.add(c); 
    arrayList.add(b); 
    arrayList.add(d); 
    Iterable<Object> iterable = arrayList; 
    String result = ""; 
    for (Object object : iterable) { 
     if (object.equals(a)) 
      result += "a"; 
     else if (object.equals(b)) 
      result += "b"; 
     else if (object.equals(c)) 
      result += "c"; 
     else if (object.equals(d)) 
      result += "d"; 
     else 
      result += "x"; 
    } 
    Pattern pattern = Pattern.compile("a.*b"); 
    return pattern.matcher(result).find(); 
} 
+0

Pensé en esto y haría el trabajo, pero suena un poco peculiar. Gracias por esta solución –

1

Creo que lo que hace que su problema diferente de una expresión regular coincidente común es que que no tienen el alfabeto de idioma hasta que se obtiene el patrón. Por lo tanto, debe leer su patrón una vez para construir el alfabeto del idioma. Según su explicación, creo que un conjunto finito de objetos son elementos básicos de su idioma. Una vez que tenga la lista de símbolos de idioma, puede usar su propia implementación de coincidencia de expresiones regulares o puede convertir su secuencia y patrón en una Cadena (asignando sus objetos a caracteres) y usar una de las API de expresión regular disponibles.

3

Echa un vistazo a este google project called ObjRegex. Es suena me gusta lo que creo que estás buscando. Estaba realmente interesado en su pregunta porque implementé algo como esto en C#, pero es patentado y no puedo compartirlo.

+0

No he probado la lib todavía pero suena exactamente como lo que estoy buscando! Otra analogía posible es la que se encuentra típicamente en un motor de CEP como [Esper] (http://esper.codehaus.org/) para realizar consultas en una secuencia de eventos, ¿en qué quizás has estado trabajando? –

Cuestiones relacionadas