public function testAbbreviation() { $unit = new Unit('Kilogram', 'kg'); $this->assertEquals('kg', $unit->getAbbr()); $unit = new Unit('Kilogram', '..kilo gram '); $this->assertEquals('kilogram', $unit->getAbbr()); $unit = new Unit('Kilogram', '1kg'); $this->assertEquals('kg', $unit->getAbbr()); }
/** * Convert over a number of hops if possible * * Breadth-first search from http://www.sitepoint.com/data-structures-4/ * * @return SplDoublyLinkedList|array */ protected function getIndirectConversion(Unit $from, Unit $to) { $origin = $from->getAbbr(); $destination = $to->getAbbr(); // Mark all nodes as unvisited $visited = array(); foreach ($this->conversions as $vertex => $adj) { $visited[$vertex] = false; } // Create a queue $q = new \SplQueue(); // Enqueue the origin vertex and mark as visited $q->enqueue($origin); $visited[$origin] = true; // Create a path that can be back-tracked $path = array(); $path[$origin] = new \SplDoublyLinkedList(); $path[$origin]->setIteratorMode(\SplDoublyLinkedList::IT_MODE_FIFO | \SplDoublyLinkedList::IT_MODE_KEEP); $found = false; while (!$q->isEmpty() && $q->bottom() != $destination) { $t = $q->dequeue(); if (!empty($this->conversions[$t])) { // For each adjacent neighbour, foreach ($this->conversions[$t] as $vertex => $conv) { if (!array_key_exists($vertex, $visited) || !$visited[$vertex]) { // Mark as visited and enqueue $q->enqueue($vertex); $visited[$vertex] = true; // Add to current path $path[$vertex] = clone $path[$t]; $path[$vertex]->push($conv); } } } } if (isset($path[$destination])) { return $path[$destination]; } else { return array(); } }