diff --git a/erpnext/stock/doctype/pick_list/test_pick_list.py b/erpnext/stock/doctype/pick_list/test_pick_list.py
index 940d40e..d32e345 100644
--- a/erpnext/stock/doctype/pick_list/test_pick_list.py
+++ b/erpnext/stock/doctype/pick_list/test_pick_list.py
@@ -3,108 +3,158 @@
 # See license.txt
 from __future__ import unicode_literals
 
-# import frappe
+import frappe
 import unittest
-# test_dependencies = ['Item', 'Sales Invoice', 'Stock Entry', 'Batch']
+test_dependencies = ['Item', 'Sales Invoice', 'Stock Entry', 'Batch']
+
+from erpnext.stock.doctype.stock_reconciliation.stock_reconciliation \
+		import EmptyStockReconciliationItemsError
 
 class TestPickList(unittest.TestCase):
+
 	def test_pick_list_picks_warehouse_for_each_item(self):
-		pass
-# 		pick_list = frappe.get_doc({
-# 			'doctype': 'Pick List',
-# 			'company': '_Test Company',
-# 			'customer': '_Test Customer',
-# 			'items_based_on': 'Sales Order',
-# 			'items': [{
-# 				'item_code': '_Test Item Home Desktop 100',
-# 				'qty': 5,
-# 				'stock_qty': 5,
-# 				'conversion_factor': 1,
-# 				'sales_order': '_T-Sales Order-1',
-# 				'sales_item': '_T-Sales Order-1_item',
-# 			}]
-# 		})
-# 		pick_list.set_item_locations()
+		try:
+			frappe.get_doc({
+				'doctype': 'Stock Reconciliation',
+				'company': '_Test Company',
+				'purpose': 'Opening Stock',
+				'expense_account': 'Temporary Opening - _TC',
+				'items': [{
+					'item_code': '_Test Item Home Desktop 100',
+					'warehouse': '_Test Warehouse - _TC',
+					'valuation_rate': 100,
+					'qty': 5
+				}]
+			}).submit()
+		except EmptyStockReconciliationItemsError:
+			pass
 
-# 		self.assertEqual(pick_list.locations[0].item_code, '_Test Item Home Desktop 100')
-# 		self.assertEqual(pick_list.locations[0].warehouse, '_Test Warehouse - _TC')
-# 		self.assertEqual(pick_list.locations[0].qty, 5)
+		pick_list = frappe.get_doc({
+			'doctype': 'Pick List',
+			'company': '_Test Company',
+			'customer': '_Test Customer',
+			'items_based_on': 'Sales Order',
+			'locations': [{
+				'item_code': '_Test Item Home Desktop 100',
+				'qty': 5,
+				'stock_qty': 5,
+				'conversion_factor': 1,
+				'sales_order': '_T-Sales Order-1',
+				'sales_item': '_T-Sales Order-1_item',
+			}]
+		})
+		pick_list.set_item_locations()
 
-	# def test_pick_list_skips_out_of_stock_item(self):
-	# 	pick_list = frappe.get_doc({
-	# 		'doctype': 'Pick List',
-	# 		'company': '_Test Company',
-	# 		'customer': '_Test Customer',
-	# 		'items_based_on': 'Sales Order',
-	# 		'items': [{
-	# 			'item_code': '_Test Item Warehouse Group Wise Reorder',
-	# 			'qty': 1000,
-	# 			'stock_qty': 1000,
-	# 			'conversion_factor': 1,
-	# 			'sales_order': '_T-Sales Order-1',
-	# 			'sales_item': '_T-Sales Order-1_item',
-	# 		}]
-	# 	})
+		self.assertEqual(pick_list.locations[0].item_code, '_Test Item Home Desktop 100')
+		self.assertEqual(pick_list.locations[0].warehouse, '_Test Warehouse - _TC')
+		self.assertEqual(pick_list.locations[0].qty, 5)
 
-	# 	pick_list.set_item_locations()
+	def test_pick_list_splits_row_according_to_warhouse_availability(self):
+		try:
+			frappe.get_doc({
+				'doctype': 'Stock Reconciliation',
+				'company': '_Test Company',
+				'purpose': 'Opening Stock',
+				'expense_account': 'Temporary Opening - _TC',
+				'items': [{
+					'item_code': '_Test Item Warehouse Group Wise Reorder',
+					'warehouse': '_Test Warehouse Group-C1 - _TC',
+					'valuation_rate': 100,
+					'qty': 5
+				}]
+			}).submit()
+		except EmptyStockReconciliationItemsError:
+			pass
 
-	# 	self.assertEqual(pick_list.locations[0].item_code, '_Test Item Warehouse Group Wise Reorder')
-	# 	self.assertEqual(pick_list.locations[0].warehouse, '_Test Warehouse Group-C1 - _TC')
-	# 	self.assertEqual(pick_list.locations[0].qty, 30)
+		try:
+			frappe.get_doc({
+				'doctype': 'Stock Reconciliation',
+				'company': '_Test Company',
+				'purpose': 'Opening Stock',
+				'expense_account': 'Temporary Opening - _TC',
+				'items': [{
+					'item_code': '_Test Item Warehouse Group Wise Reorder',
+					'warehouse': '_Test Warehouse 2 - _TC',
+					'valuation_rate': 400,
+					'qty': 10
+				}]
+			}).submit()
+		except EmptyStockReconciliationItemsError:
+			pass
 
+		pick_list = frappe.get_doc({
+			'doctype': 'Pick List',
+			'company': '_Test Company',
+			'customer': '_Test Customer',
+			'items_based_on': 'Sales Order',
+			'locations': [{
+				'item_code': '_Test Item Warehouse Group Wise Reorder',
+				'qty': 1000,
+				'stock_qty': 1000,
+				'conversion_factor': 1,
+				'sales_order': '_T-Sales Order-1',
+				'sales_item': '_T-Sales Order-1_item',
+			}]
+		})
 
-	# def test_pick_list_skips_items_in_expired_batch(self):
-	# 	pass
+		pick_list.set_item_locations()
 
-	# def test_pick_list_shows_serial_no_for_serialized_item(self):
+		self.assertEqual(pick_list.locations[0].item_code, '_Test Item Warehouse Group Wise Reorder')
+		self.assertEqual(pick_list.locations[0].warehouse, '_Test Warehouse Group-C1 - _TC')
+		self.assertEqual(pick_list.locations[0].qty, 5)
 
-	# 	stock_reconciliation = frappe.get_doc({
-	# 		'doctype': 'Stock Reconciliation',
-	# 		'company': '_Test Company',
-	# 		'items': [{
-	# 			'item_code': '_Test Serialized Item',
-	# 			'warehouse': '_Test Warehouse - _TC',
-	# 			'qty': 5,
-	# 			'serial_no': '123450\n123451\n123452\n123453\n123454'
-	# 		}]
-	# 	})
+		self.assertEqual(pick_list.locations[1].item_code, '_Test Item Warehouse Group Wise Reorder')
+		self.assertEqual(pick_list.locations[1].warehouse, '_Test Warehouse 2 - _TC')
+		self.assertEqual(pick_list.locations[1].qty, 10)
 
-	# 	stock_reconciliation.submit()
+	def test_pick_list_shows_serial_no_for_serialized_item(self):
 
-	# 	pick_list = frappe.get_doc({
-	# 		'doctype': 'Pick List',
-	# 		'company': '_Test Company',
-	# 		'customer': '_Test Customer',
-	# 		'items_based_on': 'Sales Order',
-	# 		'items': [{
-	# 			'item_code': '_Test Serialized Item',
-	# 			'qty': 1000,
-	# 			'stock_qty': 1000,
-	# 			'conversion_factor': 1,
-	# 			'sales_order': '_T-Sales Order-1',
-	# 			'sales_item': '_T-Sales Order-1_item',
-	# 		}]
-	# 	})
+		stock_reconciliation = frappe.get_doc({
+			'doctype': 'Stock Reconciliation',
+			'company': '_Test Company',
+			'items': [{
+				'item_code': '_Test Serialized Item',
+				'warehouse': '_Test Warehouse - _TC',
+				'valuation_rate': 100,
+				'qty': 5,
+				'serial_no': '123450\n123451\n123452\n123453\n123454'
+			}]
+		})
 
-	# 	pick_list.set_item_locations()
-	# 	self.assertEqual(pick_list.locations[0].item_code, '_Test Serialized Item')
-	# 	self.assertEqual(pick_list.locations[0].warehouse, '_Test Warehouse - _TC')
-	# 	self.assertEqual(pick_list.locations[0].qty, 5)
-	# 	self.assertEqual(pick_list.locations[0].serial_no, '123450\n123451\n123452\n123453\n123454')
+		stock_reconciliation.submit()
 
+		pick_list = frappe.get_doc({
+			'doctype': 'Pick List',
+			'company': '_Test Company',
+			'customer': '_Test Customer',
+			'items_based_on': 'Sales Order',
+			'locations': [{
+				'item_code': '_Test Serialized Item',
+				'qty': 1000,
+				'stock_qty': 1000,
+				'conversion_factor': 1,
+				'sales_order': '_T-Sales Order-1',
+				'sales_item': '_T-Sales Order-1_item',
+			}]
+		})
+
+		pick_list.set_item_locations()
+		self.assertEqual(pick_list.locations[0].item_code, '_Test Serialized Item')
+		self.assertEqual(pick_list.locations[0].warehouse, '_Test Warehouse - _TC')
+		self.assertEqual(pick_list.locations[0].qty, 5)
+		self.assertEqual(pick_list.locations[0].serial_no, '123450\n123451\n123452\n123453\n123454')
 
 	# def test_pick_list_for_multiple_reference_doctypes(self):
 	# 	pass
 
+	# def test_pick_list_skips_items_in_expired_batch(self):
+	# 	pass
 
-## records required
+	# def test_pick_list_from_sales_order(self):
+	# 	pass
 
-'''
-batch no
-items
-sales invoice
-stock entries
-	bin
-	stock ledger entry
-warehouses
-'''
\ No newline at end of file
+	# def test_pick_list_from_work_order(self):
+	# 	pass
+
+	# def test_pick_list_from_material_request(self):
+	# 	pass
\ No newline at end of file
