001package org.junit.experimental.theories;
002
003import static java.lang.String.format;
004
005public abstract class PotentialAssignment {
006    public static class CouldNotGenerateValueException extends Exception {
007        private static final long serialVersionUID = 1L;
008        
009        public CouldNotGenerateValueException() {
010        }
011        
012        public CouldNotGenerateValueException(Throwable e) {
013            super(e);
014        }
015    }
016
017    public static PotentialAssignment forValue(final String name, final Object value) {
018        return new PotentialAssignment() {
019            @Override
020            public Object getValue() {
021                return value;
022            }
023
024            @Override
025            public String toString() {
026                return format("[%s]", value);
027            }
028
029            @Override
030            public String getDescription() {
031                String valueString;
032
033                if (value == null) {
034                    valueString = "null";
035                } else {
036                    try {
037                        valueString = format("\"%s\"", value);
038                    } catch (Throwable e) {
039                        valueString = format("[toString() threw %s: %s]", 
040                                             e.getClass().getSimpleName(), e.getMessage());
041                    }
042                }
043
044                return format("%s <from %s>", valueString, name);
045            }
046        };
047    }
048
049    public abstract Object getValue() throws CouldNotGenerateValueException;
050
051    public abstract String getDescription() throws CouldNotGenerateValueException;
052}