
// PredicateMapTester.java
// Gary Myers, 10/5/2016.
// Andrew Davison, ad@coe.psu.ac.th, May 2023

/* A PredicatedMap decorates another Map so that it can validate 
   that an addition matches a specified predicate. 

   Also see the two examples MapUtilsTester.java

  Usage:
    > compile PredicateMapTester.java
    > run PredicateMapTester

   Also see:
     LRUMapTester.java
     OrderedMapTester.java
     ExpiringMapTester
     TransformedMapTester
     SplitMapTester
     PredicateMapTester.java
   and
     MapUtilsTester.java

*/


import java.util.*;

import org.apache.commons.collections4.*;
import org.apache.commons.collections4.functors.*;
import org.apache.commons.collections4.map.*;



public class PredicateMapTester 
{

  public static void main(String[] args) 
  {
    System.out.println("A map that does not accept nulls");

    Map<String, String> map1 = PredicatedMap.predicatedMap(
          new HashMap<String, String>(),
          NotNullPredicate.notNullPredicate(),    // key predicate
          NotNullPredicate.notNullPredicate() );  // value predicate

    map1.put("one", "A");

    System.out.println("Try to add a null key: ");
    try {
      map1.put(null, "B");
    } 
    catch (Exception e)
    {  System.out.println(e.getMessage()); }

    System.out.println("Try to add a null value: ");
    try {
      map1.put("two", null);
    } 
    catch (Exception e)
    {  System.out.println(e.getMessage()); }

    System.out.println("Map 1: " + map1);

    // -----------------------------------------


    System.out.println("\nA map with keys > 3 and green or red values");
    Map<String, String> map2 = PredicatedMap.predicatedMap(
         new HashMap<String,String>(),
         k -> (k.length() > 3),     // key
         v -> (v.equals("green") || v.equals("red")) );  // value
    map2.put( "tony" , "green" );
    map2.put( "alice" , "red" );
    map2.put( "mike" , "red" );
    map2.put( "bobby" , "green" );

    System.out.println("Key too small");
    try {  map2.put("tim", "green");  }
    catch (Exception e)
    {  System.out.println(e.getMessage()); }

    System.out.println("Non-allowed value");
    try {  map2.put("alice", "purple");  }
    catch (Exception e)
    {  System.out.println(e.getMessage()); }

    System.out.println("Map 2: " + map2);

  } // end of main()

}  // end of PredicateMapTester class