commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r6168 - in gnuradio/branches/developers/jcorgan/fg/gnu


From: jcorgan
Subject: [Commit-gnuradio] r6168 - in gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src: lib/runtime python/gnuradio/gr
Date: Thu, 23 Aug 2007 11:25:53 -0600 (MDT)

Author: jcorgan
Date: 2007-08-23 11:25:53 -0600 (Thu, 23 Aug 2007)
New Revision: 6168

Modified:
   
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/gr_flowgraph.cc
   
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/qa_gr_flowgraph.cc
   
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/qa_gr_flowgraph.h
   
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
Log:
Refactor topology related QA code into cppunit-based QA in runtime directory.

Modified: 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/gr_flowgraph.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/gr_flowgraph.cc
       2007-08-23 01:14:32 UTC (rev 6167)
+++ 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/gr_flowgraph.cc
       2007-08-23 17:25:53 UTC (rev 6168)
@@ -118,7 +118,7 @@
 void
 gr_flowgraph::check_dst_not_used(const gr_endpoint &dst)
 {
-  // An destination is in use if it is already on the edge list
+  // A destination is in use if it is already on the edge list
   for (gr_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++)
     if (p->dst() == dst)
       throw std::invalid_argument("dst already in use");

Modified: 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/qa_gr_flowgraph.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/qa_gr_flowgraph.cc
    2007-08-23 01:14:32 UTC (rev 6167)
+++ 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/qa_gr_flowgraph.cc
    2007-08-23 17:25:53 UTC (rev 6168)
@@ -26,6 +26,9 @@
 
 #include <qa_gr_flowgraph.h>
 #include <gr_flowgraph.h>
+#include <gr_nop.h>
+#include <gr_null_source.h>
+#include <gr_null_sink.h>
 
 void qa_gr_flowgraph::t0()
 {
@@ -33,3 +36,210 @@
 
   CPPUNIT_ASSERT(fg);
 }
+
+void qa_gr_flowgraph::t1_connect()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+
+  fg->connect(nop1, 0, nop2, 0);
+}
+
+void qa_gr_flowgraph::t2_connect_invalid_src_port_neg()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+
+  CPPUNIT_ASSERT_THROW(fg->connect(nop1, -1, nop2, 0), std::invalid_argument);
+}
+
+void qa_gr_flowgraph::t3_connect_src_port_exceeds()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr src = gr_make_null_source(sizeof(int));
+  gr_block_sptr dst = gr_make_null_sink(sizeof(int));
+
+  CPPUNIT_ASSERT_THROW(fg->connect(src, 1, dst, 0), std::invalid_argument);
+}
+
+void qa_gr_flowgraph::t4_connect_invalid_dst_port_neg()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+
+  CPPUNIT_ASSERT_THROW(fg->connect(nop1, 0, nop2, -1), std::invalid_argument);
+}
+
+void qa_gr_flowgraph::t5_connect_dst_port_exceeds()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr src = gr_make_null_source(sizeof(int));
+  gr_block_sptr dst = gr_make_null_sink(sizeof(int));
+
+  CPPUNIT_ASSERT_THROW(fg->connect(src, 0, dst, 1), std::invalid_argument);
+}
+
+void qa_gr_flowgraph::t6_connect_dst_in_use()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr src1 = gr_make_null_source(sizeof(int));
+  gr_block_sptr src2 = gr_make_null_source(sizeof(int));
+  gr_block_sptr dst = gr_make_null_sink(sizeof(int));
+
+  fg->connect(src1, 0, dst, 0);
+  CPPUNIT_ASSERT_THROW(fg->connect(src2, 0, dst, 0), std::invalid_argument);
+}
+
+void qa_gr_flowgraph::t7_connect_one_src_two_dst()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr src = gr_make_null_source(sizeof(int));
+  gr_block_sptr dst1 = gr_make_null_sink(sizeof(int));
+  gr_block_sptr dst2 = gr_make_null_sink(sizeof(int));
+
+  fg->connect(src, 0, dst1, 0);
+  fg->connect(src, 0, dst2, 0);
+}
+
+void qa_gr_flowgraph::t8_connect_type_mismatch()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(char));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+
+  CPPUNIT_ASSERT_THROW(fg->connect(nop1, 0, nop2, 0), std::invalid_argument);
+}
+
+void qa_gr_flowgraph::t9_disconnect()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+
+  fg->connect(nop1, 0, nop2, 0);
+  fg->disconnect(nop1, 0, nop2, 0);
+}
+
+void qa_gr_flowgraph::t10_disconnect_unconnected_block()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop3 = gr_make_nop(sizeof(int));
+
+  fg->connect(nop1, 0, nop2, 0);
+  CPPUNIT_ASSERT_THROW(fg->disconnect(nop1, 0, nop3, 0), 
std::invalid_argument);
+}
+
+void qa_gr_flowgraph::t11_disconnect_unconnected_port()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+
+  fg->connect(nop1, 0, nop2, 0);
+  CPPUNIT_ASSERT_THROW(fg->disconnect(nop1, 0, nop2, 1), 
std::invalid_argument);
+}
+
+void qa_gr_flowgraph::t12_validate()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+
+  fg->connect(nop1, 0, nop2, 0);
+  fg->validate();
+}
+
+void qa_gr_flowgraph::t13_validate_missing_input_assignment()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+
+  fg->connect(nop1, 0, nop2, 0);
+  fg->connect(nop1, 0, nop2, 2);
+  CPPUNIT_ASSERT_THROW(fg->validate(), std::runtime_error);
+}
+
+void qa_gr_flowgraph::t14_validate_missing_output_assignment()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+
+  fg->connect(nop1, 0, nop2, 0);
+  fg->connect(nop1, 2, nop2, 1);
+  CPPUNIT_ASSERT_THROW(fg->validate(), std::runtime_error);
+}
+
+void qa_gr_flowgraph::t15_clear()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop1 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop2 = gr_make_nop(sizeof(int));
+
+  fg->connect(nop1, 0, nop2, 0);
+
+  CPPUNIT_ASSERT(fg->edges().size() == 1);
+  CPPUNIT_ASSERT(fg->calc_used_blocks().size() == 2);
+
+  fg->clear();
+
+  CPPUNIT_ASSERT(fg->edges().size() == 0);
+  CPPUNIT_ASSERT(fg->calc_used_blocks().size() == 0);
+}
+
+void qa_gr_flowgraph::t16_partition()
+{
+  gr_flowgraph_sptr fg = gr_make_flowgraph();
+
+  gr_block_sptr nop11 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop12 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop13 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop14 = gr_make_nop(sizeof(int));
+
+  gr_block_sptr nop21 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop22 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop23 = gr_make_nop(sizeof(int));
+
+  gr_block_sptr nop31 = gr_make_nop(sizeof(int));
+  gr_block_sptr nop32 = gr_make_nop(sizeof(int));
+  
+  // Build disjoint graph #1
+  fg->connect(nop11, 0, nop12, 0);
+  fg->connect(nop12, 0, nop13, 0);
+  fg->connect(nop13, 0, nop14, 0);
+
+  // Build disjoint graph #2
+  fg->connect(nop21, 0, nop22, 0);
+  fg->connect(nop22, 0, nop23, 0);
+
+  // Build disjoint graph #3
+  fg->connect(nop31, 0, nop32, 0);
+
+  std::vector<gr_basic_block_vector_t> graphs = fg->partition();
+
+  CPPUNIT_ASSERT(graphs.size() == 3);
+  CPPUNIT_ASSERT(graphs[0].size() == 4);
+  CPPUNIT_ASSERT(graphs[1].size() == 3);
+  CPPUNIT_ASSERT(graphs[2].size() == 2);
+}

Modified: 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/qa_gr_flowgraph.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/qa_gr_flowgraph.h
     2007-08-23 01:14:32 UTC (rev 6167)
+++ 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/lib/runtime/qa_gr_flowgraph.h
     2007-08-23 17:25:53 UTC (rev 6168)
@@ -29,14 +29,47 @@
 
 class qa_gr_flowgraph : public CppUnit::TestCase 
 {
-    CPPUNIT_TEST_SUITE(qa_gr_flowgraph);
+  CPPUNIT_TEST_SUITE(qa_gr_flowgraph);
+  
+  CPPUNIT_TEST(t0);
+  CPPUNIT_TEST(t1_connect);
+  CPPUNIT_TEST(t2_connect_invalid_src_port_neg);
+  CPPUNIT_TEST(t3_connect_src_port_exceeds);
+  CPPUNIT_TEST(t4_connect_invalid_dst_port_neg);
+  CPPUNIT_TEST(t5_connect_dst_port_exceeds);
+  CPPUNIT_TEST(t6_connect_dst_in_use);
+  CPPUNIT_TEST(t7_connect_one_src_two_dst);
+  CPPUNIT_TEST(t8_connect_type_mismatch);
+  CPPUNIT_TEST(t9_disconnect);
+  CPPUNIT_TEST(t10_disconnect_unconnected_block);
+  CPPUNIT_TEST(t11_disconnect_unconnected_port);
+  CPPUNIT_TEST(t12_validate);
+  CPPUNIT_TEST(t13_validate_missing_input_assignment);
+  CPPUNIT_TEST(t14_validate_missing_output_assignment);
+  CPPUNIT_TEST(t15_clear);
+  CPPUNIT_TEST(t16_partition);
 
-    CPPUNIT_TEST(t0);
-    
-    CPPUNIT_TEST_SUITE_END();
+  CPPUNIT_TEST_SUITE_END();
 
 private:
-    void t0();
+
+  void t0();
+  void t1_connect();
+  void t2_connect_invalid_src_port_neg();
+  void t3_connect_src_port_exceeds();
+  void t4_connect_invalid_dst_port_neg();
+  void t5_connect_dst_port_exceeds();
+  void t6_connect_dst_in_use();
+  void t7_connect_one_src_two_dst();
+  void t8_connect_type_mismatch();
+  void t9_disconnect();
+  void t10_disconnect_unconnected_block();
+  void t11_disconnect_unconnected_port();
+  void t12_validate();
+  void t13_validate_missing_input_assignment();
+  void t14_validate_missing_output_assignment();
+  void t15_clear();
+  void t16_partition();
 };
 
 #endif /* INCLUDED_QA_GR_FLOWGRAPH_H */

Modified: 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
      2007-08-23 01:14:32 UTC (rev 6167)
+++ 
gnuradio/branches/developers/jcorgan/fg/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
      2007-08-23 17:25:53 UTC (rev 6168)
@@ -20,14 +20,6 @@
        self.assertEqual(1, hblock.output_signature().max_streams())
        self.assertEqual(gr.sizeof_int, 
hblock.output_signature().sizeof_stream_item(0))
 
-    def test_001_connect_internal(self):
-       hblock = gr.hier_block2("test_block", 
-                               gr.io_signature(1,1,gr.sizeof_int), 
-                               gr.io_signature(1,1,gr.sizeof_int))
-       nop1 = gr.nop(gr.sizeof_int)
-       nop2 = gr.nop(gr.sizeof_int)
-       hblock.connect(nop1, nop2)
-
     def test_002_connect_input(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
@@ -35,7 +27,7 @@
        nop1 = gr.nop(gr.sizeof_int)
        hblock.connect(hblock, nop1)
 
-    def test_002a_connect_input_in_use(self):
+    def test_003_connect_input_in_use(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -45,14 +37,14 @@
        self.assertRaises(ValueError,
            lambda: hblock.connect(hblock, nop2))
 
-    def test_003_connect_output(self):
+    def test_004_connect_output(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
        nop1 = gr.nop(gr.sizeof_int)
        hblock.connect(nop1, hblock)
 
-    def test_003a_connect_output_in_use(self):
+    def test_005_connect_output_in_use(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -62,7 +54,7 @@
        self.assertRaises(ValueError,
            lambda: hblock.connect(nop2, hblock))
 
-    def test_004_connect_invalid_src_port_neg(self):
+    def test_006_connect_invalid_src_port_neg(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -78,7 +70,7 @@
        self.assertRaises(ValueError, 
            lambda: hblock.connect((hblock, 1), nop1))
 
-    def test_006_connect_invalid_dst_port_neg(self):
+    def test_007_connect_invalid_dst_port_neg(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -87,7 +79,7 @@
        self.assertRaises(ValueError, 
            lambda: hblock.connect(nop1, (nop2, -1)))
 
-    def test_007_connect_invalid_dst_port_exceeds(self):
+    def test_008_connect_invalid_dst_port_exceeds(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -96,54 +88,11 @@
        self.assertRaises(ValueError, 
            lambda: hblock.connect(nop1, (nop2, 1)))
 
-    def test_008_connect_dst_port_in_use(self):
-       hblock = gr.hier_block2("test_block", 
-                               gr.io_signature(1,1,gr.sizeof_int), 
-                               gr.io_signature(1,1,gr.sizeof_int))
-       nop1 = gr.nop(gr.sizeof_int)
-       nop2 = gr.nop(gr.sizeof_int)
-       hblock.connect(nop1, nop2);
-       self.assertRaises(ValueError, 
-           lambda: hblock.connect(nop1, nop2))
-
-    def test_009_connect_one_src_two_dst(self):
+    def test_009_check_topology(self):
        hblock = gr.top_block("test_block")
-       src = gr.null_source(gr.sizeof_int)
-       dst1 = gr.null_sink(gr.sizeof_int)
-       dst2 = gr.null_sink(gr.sizeof_int)
-       hblock.connect(src, dst1)
-       hblock.connect(src, dst2)
-
-    def test_010_connect_type_mismatch(self):
-       hblock = gr.top_block("test_block")
-       nop1 = gr.nop(gr.sizeof_char)
-       nop2 = gr.nop(gr.sizeof_int)
-       self.assertRaises(ValueError, 
-           lambda: hblock.connect(nop1, nop2))
-
-    def test_011_check_topology(self):
-       hblock = gr.top_block("test_block")
        hblock.check_topology(0, 0)
 
-    def test_012_disconnect(self):
-       hblock = gr.top_block("test_block") 
-       nop1 = gr.nop(gr.sizeof_int)
-       nop2 = gr.nop(gr.sizeof_int)
-       hblock.connect(nop1, nop2)
-        hblock.disconnect(nop1, nop2)
-
-    def test_013_disconnect_not_connected(self):
-       hblock = gr.hier_block2("test_block", 
-                               gr.io_signature(1,1,gr.sizeof_int), 
-                               gr.io_signature(1,1,gr.sizeof_int))
-       nop1 = gr.nop(gr.sizeof_int)
-       nop2 = gr.nop(gr.sizeof_int)
-       nop3 = gr.nop(gr.sizeof_int)
-       hblock.connect(nop1, nop2)
-       self.assertRaises(ValueError, 
-           lambda: hblock.disconnect(nop1, nop3))
-
-    def test_014_run(self):
+    def test_010_run(self):
         expected = (1.0, 2.0, 3.0, 4.0)
         hblock = gr.top_block("test_block")
         src = gr.vector_source_f(expected, False)
@@ -158,7 +107,7 @@
         self.assertEquals(expected, actual1)
         self.assertEquals(expected, actual2)
 
-    def test_015_disconnect_input(self):
+    def test_012_disconnect_input(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -166,7 +115,7 @@
        hblock.connect(hblock, nop1)
         hblock.disconnect(hblock, nop1)
    
-    def test_016_disconnect_input_not_connected(self):
+    def test_013_disconnect_input_not_connected(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -176,7 +125,7 @@
         self.assertRaises(ValueError,
             lambda: hblock.disconnect(hblock, nop2))
    
-    def test_017_disconnect_input_neg(self):
+    def test_014_disconnect_input_neg(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -185,7 +134,7 @@
         self.assertRaises(ValueError,
             lambda: hblock.disconnect((hblock, -1), nop1))
 
-    def test_018_disconnect_input_exceeds(self):
+    def test_015_disconnect_input_exceeds(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -194,7 +143,7 @@
         self.assertRaises(ValueError,
             lambda: hblock.disconnect((hblock, 1), nop1))
 
-    def test_019_disconnect_output(self):
+    def test_016_disconnect_output(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -202,7 +151,7 @@
        hblock.connect(nop1, hblock)
         hblock.disconnect(nop1, hblock)
    
-    def test_020_disconnect_output_not_connected(self):
+    def test_017_disconnect_output_not_connected(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -212,7 +161,7 @@
         self.assertRaises(ValueError,
             lambda: hblock.disconnect(nop2, hblock))
    
-    def test_021_disconnect_output_neg(self):
+    def test_018_disconnect_output_neg(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -221,7 +170,7 @@
         self.assertRaises(ValueError,
             lambda: hblock.disconnect(nop1, (hblock, -1)))
 
-    def test_022_disconnect_output_exceeds(self):
+    def test_019_disconnect_output_exceeds(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
@@ -230,7 +179,7 @@
         self.assertRaises(ValueError,
             lambda: hblock.disconnect(nop1, (hblock, 1)))
 
-    def test_023_run(self):
+    def test_020_run(self):
        hblock = gr.top_block("test_block")
        data = (1.0, 2.0, 3.0, 4.0)
        src = gr.vector_source_f(data, False)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]