package org.simpleframework.xml.transform;

import java.io.StringWriter;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.ValidationTestCase;
import org.simpleframework.xml.core.Persister;

public class RegistryMatcherTest extends ValidationTestCase {
   
   public static class A {
      private String value;
      public A(String value){
         this.value = value;
      }
      public String getValue(){
         return value;
      }
   }
   public static class B {
      private String value;
      public B(String value){
         this.value = value;
      }
      public String getValue(){
         return value;
      }
   }
   public static class C {
      private String value;
      public C(String value){
         this.value = value;
      }
      public String getValue(){
         return value;
      }
   }
   public static class ATransform implements Transform<A> {
      public A read(String value) throws Exception {
         return new A(value);
      }
      public String write(A value) throws Exception {
         return value.getValue();
      }    
   }
   public static class BTransform implements Transform<B> {
      public B read(String value) throws Exception {
         return new B(value);
      }
      public String write(B value) throws Exception {
         return value.getValue();
      }    
   }
   public static class CTransform implements Transform<C> {
      public C read(String value) throws Exception {
         return new C(value);
      }
      public String write(C value) throws Exception {
         return value.getValue();
      }    
   }
   @Root
   private static class Example {
      @Element
      private final A a;
      @Attribute
      private final B b;
      @Attribute
      private final C c;
      public Example(A a, B b, C c) {
         this.a = a;
         this.b = b;
         this.c = c;
      }
      public A getA() {
         return a;
      }
      public B getB() {
         return b;
      }
      public C getC() {
         return c;
      }
   }
   
   public void testMatcher() throws Exception {
      RegistryMatcher matcher = new RegistryMatcher();
      Transform<C> transform = new CTransform();
      matcher.bind(A.class, ATransform.class);
      matcher.bind(B.class, BTransform.class);
      matcher.bind(C.class, transform);
      Transform<A> a = matcher.match(A.class);
      Transform<B> b = matcher.match(B.class);
      Transform<C> c = matcher.match(C.class);
      A ia = a.read("A");
      B ib = b.read("B");
      C ic = c.read("C");
      assertEquals(ia.getValue(), "A");
      assertEquals(ib.getValue(), "B");
      assertEquals(ic.getValue(), "C");
      Persister persister = new Persister(matcher);
      Example example = new Example(ia, ib, ic);
      StringWriter writer = new StringWriter();
      persister.write(example, writer);
      String text = writer.toString();
      assertElementExists(text, "/example");
      assertElementExists(text, "/example/a");
      assertElementHasValue(text, "/example/a", "A");
      assertElementHasAttribute(text, "/example", "b", "B");
      assertElementHasAttribute(text, "/example", "c", "C");
   }
   

}