<?php

class ContextUnitTest extends DrupalWebTestCase {
  protected $profile = 'testing';

  public static function getInfo() {
    return array(
      'name' => 'API unit tests',
      'description' => 'Sets all possible context types and checks for integrity.',
      'group' => 'Context',
    );
  }

  public function setUp() {
    parent::setUp('context');
  }

  public function test() {
    // define possible data types
    $set_types = array(
      'bool'    => TRUE,
      'int'     => 1,
      'string'  => 'lorem',
      'array'   => array('lorem'),
      'object'  => new stdClass(),
    );
    $id_types = array('int', 'string');

    // NAMESPACE
    foreach ($set_types as $type => $val) {
      $set = context_set($val);
      // Test return value of context_set()
      if (in_array($type, $id_types)) {
        // test set integrity
        $this->assertIdentical(true, $set, 'Space set successful.');
        // test get integrity
        $this->assertIdentical(array(), context_get($val), 'Namespace get successful.');
        $this->assertIdentical(true, context_exists($val), 'Namespace exists successful.');
      }
      else {
        $this->assertIdentical(false, $set, 'Prohibited namespace not established.');
      }
      context_clear();
    }

    // NAMESPACE+ATTRIBUTE
    foreach ($set_types as $type => $val) {
      foreach ($set_types as $type2 => $val2) {
        // test set integrity
        $set = context_set($val, $val2);
        if (in_array($type, $id_types)) {
          // test set integrity
          if ($type2 != 'bool') {
            $this->assertIdentical(true, $set, 'Namespace and attribute set successful.');
          }
          else {
            $this->assertIdentical(false, $set);
          }
          // test get + exists integrity
          if (in_array($type2, $id_types)) {
            $this->assertIdentical(true, (context_get($val, $val2) == $val2), 'Namespace and attribute get successful.');
            $this->assertIdentical(true, context_exists($val, $val2), 'Namespace and attribute exists.');
          }
          elseif (in_array($type2, array('array', 'object'))) {
            $this->assertIdentical(true, (context_get($val) == $val2), 'Namespace and attribute get successful.');
            $this->assertIdentical(true, context_exists($val), 'Namespace and attribute exists.');
          }
        }
      }
      context_clear();
    }

    // NAMESPACE+ATTRIBUTE+VALUE, o lord
    foreach ($set_types as $type => $val) {
      foreach ($set_types as $type2 => $val2) {
        foreach ($set_types as $type3 => $val3) {
          $set = context_set($val, $val2, $val3);
          if (in_array($type, $id_types)) {
            if (in_array($type2, $id_types)) {
              $this->assertIdentical(true, (context_get($val, $val2, $val3) == $val3), 'Namespace, attribute and value get successful.');
              $this->assertIdentical(true, context_exists($val, $val2, $val3), 'Namespace, attribute and value exists.');
            }
          }
          context_clear();
        }
      }
    }
  }
}