<?xml version="1.0"?>
<extension name="uuid" version="0.0.6">
 <summary>uuid extension</summary>
 <description>libuuid binding</description>
 <deps language="c">
  <with name="libuuid" defaults="/lib:/usr:/usr/local" testfile="include/uuid/uuid.h">
   <header name="uuid/uuid.h" />
   <lib name="uuid" />
  </with>
 </deps>
 <license>PHP</license>
 <maintainer>
  <user>shimooka</user>
  <name>SHIMOOKA Hideyuki</name>
  <email>shimooka@doyouphp.jp</email>
  <role>lead</role>
 </maintainer>
 <release>
  <version>0.0.6</version>
  <date>2007-03-30</date>
  <state>alpha</state>
  <notes>First alpha version</notes>
 </release>

 <code position="top">
  <![CDATA[
#define UUID_METHOD_DEFAULT 0
#define UUID_METHOD_RANDOM 1
#define UUID_METHOD_TIME 2
  ]]>
 </code>

 <class name="UUID">
  <summary>UUID</summary>
  <description>a class implementaion of uuid</description>
  <property name="uuid" access="private" type="string"/>

  <constant name="UUID_METHOD_DEFAULT" type="int" value="UUID_METHOD_DEFAULT"/>
  <constant name="UUID_METHOD_RANDOM" type="int" value="UUID_METHOD_RANDOM"/>
  <constant name="UUID_METHOD_TIME" type="int" value="UUID_METHOD_TIME"/>

  <function name="__construct">
   <proto>void __construct([int method])</proto>
   <code>
    <![CDATA[
/**
 * @see http://e2fsprogs.sourceforge.net/
 * @see uuidgen.c
 * @see uuid_generate(3)
 * @see uuid_unparse(3)
 */
uuid_t uu;
char str[37];
switch (method) {
case UUID_METHOD_RANDOM:
    uuid_generate_random(uu);
    break;
case UUID_METHOD_TIME:
    uuid_generate_time(uu);
    break;
default:
    uuid_generate(uu);
}
uuid_unparse(uu, str);
//RETURN_STRING(str, 1);
PROP_SET_STRING(uuid, str);
]]>
   </code>
   <test>
    <code>
     <![CDATA[
$uuid = new UUID();
echo ((get_class($uuid) === 'UUID') ? 'OK' : 'NG');
]]>
    </code>
    <result>OK</result>
   </test>
  </function>

  <function name="getTime">
   <proto>int getTime()</proto>
   <code>
    <![CDATA[
/**
 * @see uuid_time(3)
 */
uuid_t uu;
if (uuid_parse(PROP_GET_STRING(uuid), uu)) {
    RETURN_FALSE;
}
if (uuid_is_null(uu) == 1) {
    RETURN_FALSE;
}
if (uuid_type(uu) != 1) {
    RETURN_FALSE;
}
RETURN_LONG(uuid_time(uu, NULL));
]]>
   </code>
   <test>
    <code>
     <![CDATA[
$uuid = new UUID();
echo ($uuid->getTime() ? 'OK' : 'NG');
$uuid = new UUID(UUID::UUID_METHOD_DEFAULT);
echo ($uuid->getTime() ? 'OK' : 'NG');
$uuid = new UUID(UUID::UUID_METHOD_RANDOM);
echo ($uuid->getTime() ? 'OK' : 'NG');
$uuid = new UUID(UUID::UUID_METHOD_TIME);
echo ($uuid->getTime() ? 'OK' : 'NG');
]]>
    </code>
    <result>NGNGNGOK</result>
   </test>
  </function>

  <function name="clear">
   <proto>void clear()</proto>
   <code>
    <![CDATA[
/**
 * @see uuid_clear(3)
 */
uuid_t uu;
char str[37];
if (uuid_parse(PROP_GET_STRING(uuid), uu)) {
    RETURN_FALSE;
}
uuid_clear(uu);
uuid_unparse(uu, str);
PROP_SET_STRING(uuid, str);
]]>
   </code>
   <test>
    <code>
     <![CDATA[
$uuid = new UUID();
$uuid->clear();
echo (($uuid->get() === '00000000-0000-0000-0000-000000000000') ? 'OK' : 'NG');
$uuid = new UUID(UUID::UUID_METHOD_DEFAULT);
$uuid->clear();
echo (($uuid->get() === '00000000-0000-0000-0000-000000000000') ? 'OK' : 'NG');
$uuid = new UUID(UUID::UUID_METHOD_RANDOM);
$uuid->clear();
echo (($uuid->get() === '00000000-0000-0000-0000-000000000000') ? 'OK' : 'NG');
$uuid = new UUID(UUID::UUID_METHOD_TIME);
$uuid->clear();
echo (($uuid->get() === '00000000-0000-0000-0000-000000000000') ? 'OK' : 'NG');
]]>
    </code>
    <result>OKOKOKOK</result>
   </test>
  </function>

  <function name="compareTo">
   <proto>boolean compareTo(string uuid)</proto>
   <code>
    <![CDATA[
/**
 * @see uuid_compare(3)
 */
uuid_t uu1, uu2;
if (uuid_parse(PROP_GET_STRING(uuid), uu1) || uuid_parse(uuid, uu2)) {
    RETURN_FALSE;
}
RETURN_LONG(uuid_compare(uu1, uu2));
]]>
   </code>
   <test>
    <code>
     <![CDATA[
$uuid1 = new UUID();
$uuid2 = $uuid1;
$uuid3 = new UUID();;
echo (($uuid1->compareTo($uuid2->get()) === 0)  ? 'OK' : 'NG');
echo (($uuid1->compareTo($uuid3->get()) !== 0)  ? 'OK' : 'NG');
]]>
    </code>
    <result>OKOK</result>
   </test>
  </function>

  <function name="getType">
   <proto>boolean getType()</proto>
   <code>
    <![CDATA[
uuid_t uu;
if (uuid_parse(PROP_GET_STRING(uuid), uu)) {
    RETURN_FALSE;
}
RETURN_LONG(uuid_type(uu));
]]>
   </code>
   <test>
    <code>
     <![CDATA[
$uuid = new UUID();
echo (($uuid->getType() === 4) ? 'OK' : 'NG');
$uuid = new UUID(UUID::UUID_METHOD_DEFAULT);
echo (($uuid->getType() === 4) ? 'OK' : 'NG');
$uuid = new UUID(UUID::UUID_METHOD_RANDOM);
echo (($uuid->getType() === 4) ? 'OK' : 'NG');
$uuid = new UUID(UUID::UUID_METHOD_TIME);
echo (($uuid->getType() === 1) ? 'OK' : 'NG');
]]>
    </code>
    <result>OKOKOKOK</result>
   </test>
  </function>

  <function name="get">
   <proto>string get()</proto>
   <code>
    <![CDATA[
RETURN_STRING(PROP_GET_STRING(uuid), 1);
]]>
   </code>
   <test>
    <code>
     <![CDATA[
$uuid = new UUID();
echo strlen($uuid->get());
]]>
    </code>
    <result>36</result>
   </test>

   <test>
    <code>
     <![CDATA[
$uuid = new UUID(UUID::UUID_METHOD_DEFAULT);
echo strlen($uuid->get());
]]>
    </code>
    <result>36</result>
   </test>

   <test>
    <code>
     <![CDATA[
$uuid = new UUID(UUID::UUID_METHOD_RANDOM);
echo strlen($uuid->get());
]]>
    </code>
    <result>36</result>
   </test>

   <test>
    <code>
     <![CDATA[
$uuid = new UUID(UUID::UUID_METHOD_TIME);
echo strlen($uuid->get());
]]>
    </code>
    <result>36</result>
   </test>

  </function>

  <function name="__toString">
   <proto>string __toString()</proto>
   <code>
    <![CDATA[
RETURN_STRING(PROP_GET_STRING(uuid), 1);
]]>
   </code>
   <test>
    <code>
     <![CDATA[
$uuid = new UUID();
echo (($uuid->get() === $uuid->__toString()) ? 'OK' : 'NG');
]]>
    </code>
    <result>OK</result>
   </test>
  </function>

 </class>


 <test>
  <code>echo UUID::UUID_METHOD_DEFAULT;</code>
  <result>0</result>
 </test>

 <test>
  <code>echo UUID::UUID_METHOD_RANDOM;</code>
  <result>1</result>
 </test>

 <test>
  <code>echo UUID::UUID_METHOD_TIME;</code>
  <result>2</result>
 </test>

</extension>

