class Solution():
    def __init__(self):
        for t in range(int(input())):
            self.queue = [None for i in range(50 * 50)]
            self.used = [[-1 for col in range(50)] for row in range(50)]
            n, m = list(map(int, input().split()))
            a = [input() for i in range(n)]
            self.solve(n, m, a, t)
    
    def inside(self, x, y, n, m):
        return x >= 0 and x < n and y >= 0 and y < m

    def solve(self, n, m, a, t):
        totalGood = sum([1 for i in range(n) for j in range(m) if a[i][j] == 'G'])
        l = r = 0
        self.queue[0] = (n - 1, m - 1)
        self.used[n - 1][m - 1] = t
        p = [(0, -1), (0, 1), (-1, 0), (1, 0)]
        goGood = 0
        while l <= r:
            x, y = self.queue[l]
            l += 1
            cantSpread = False
            for px, py in p:
                u = x + px
                v = y + py
                if self.inside(u, v, n, m) and a[u][v] == 'B':
                    cantSpread = True
                    break
            if cantSpread:
                continue
            for px, py in p:
                u = x + px
                v = y + py
                if self.inside(u, v, n, m) and self.used[u][v] != t and a[u][v] != 'B' and a[u][v] != '#':
                    r += 1
                    self.queue[r] = (u, v)
                    self.used[u][v] = t
                    goGood += 1 if a[u][v] == 'G' else 0
        if goGood < totalGood:
            return print("No")
        for i in range(n):
            for j in range(m):
                if a[i][j] == 'G':
                    for px, py in p:
                        x = i + px
                        y = j + py
                        if self.inside(x, y, n, m) and a[x][y] == 'B':
                            return print("No")
        print("Yes")

Solution()