#include <bits/stdc++.h>
using namespace std;
char buf[1000];
int n, m;
bool ok(int a, int b) { return (a < n && b < m && a > -1 && b > -1); }
int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};
vector<string> s;
bool Type2(int x, int y) {
  int xx = x, yy = y;
  int l = 0;
  while (ok(x, y) && s[x][y] == '1') {
    l++;
    int q = 0;
    for (int i = (0); i < (8); ++i)
      if (ok(x + dx[i], y + dy[i]) && s[x + dx[i]][y + dy[i]] == '1') q++;
    if (q != 2) return false;
    if ((ok(x + 1, y + 1) && s[x + 1][y + 1] != '1') || !ok(x + 1, y + 1))
      if ((ok(x + 1, y - 1) && s[x + 1][y - 1] != '1') || !ok(x + 1, y - 1))
        return false;
    if ((ok(x - 1, y - 1) && s[x - 1][y - 1] != '1') || !ok(x - 1, y - 1))
      if ((ok(x + 1, y - 1) && s[x + 1][y - 1] != '1') || !ok(x + 1, y - 1))
        return false;
    x++;
    y++;
  }
  if (l < 2) return false;
  x--;
  y--;
  while (ok(x, y) && s[x][y] == '1') {
    l--;
    int q = 0;
    for (int i = (0); i < (8); ++i)
      if (ok(x + dx[i], y + dy[i]) && s[x + dx[i]][y + dy[i]] == '1') q++;
    if (q != 2) return false;
    if ((ok(x + 1, y - 1) && s[x + 1][y - 1] != '1') || !ok(x + 1, y - 1))
      if ((ok(x - 1, y - 1) && s[x - 1][y - 1] != '1') || !ok(x - 1, y - 1))
        return false;
    if ((ok(x - 1, y + 1) && s[x - 1][y + 1] != '1') || !ok(x - 1, y + 1))
      if ((ok(x - 1, y - 1) && s[x - 1][y - 1] != '1') || !ok(x - 1, y - 1))
        return false;
    x++;
    y--;
  }
  if (l) return false;
  x--;
  y++;
  while (ok(x, y) && s[x][y] == '1') {
    int q = 0;
    for (int i = (0); i < (8); ++i)
      if (ok(x + dx[i], y + dy[i]) && s[x + dx[i]][y + dy[i]] == '1') q++;
    if (q != 2) return false;
    if ((ok(x - 1, y + 1) && s[x - 1][y + 1] != '1') || !ok(x - 1, y + 1))
      if ((ok(x - 1, y - 1) && s[x - 1][y - 1] != '1') || !ok(x - 1, y - 1))
        return false;
    if ((ok(x - 1, y + 1) && s[x - 1][y + 1] != '1') || !ok(x - 1, y + 1))
      if ((ok(x + 1, y + 1) && s[x + 1][y + 1] != '1') || !ok(x + 1, y + 1))
        return false;
    x--;
    y--;
  }
  x++;
  y++;
  while (ok(x, y) && s[x][y] == '1') {
    int q = 0;
    for (int i = (0); i < (8); ++i)
      if (ok(x + dx[i], y + dy[i]) && s[x + dx[i]][y + dy[i]] == '1') q++;
    if (q != 2) return false;
    if ((ok(x + 1, y + 1) && s[x + 1][y + 1] != '1') || !ok(x + 1, y + 1))
      if ((ok(x - 1, y + 1) && s[x - 1][y + 1] != '1') || !ok(x - 1, y + 1))
        return false;
    if ((ok(x + 1, y + 1) && s[x + 1][y + 1] != '1') || !ok(x + 1, y + 1))
      if ((ok(x + 1, y - 1) && s[x + 1][y - 1] != '1') || !ok(x + 1, y - 1))
        return false;
    x--;
    y++;
  }
  x++;
  y--;
  if (xx == x && yy == y) {
    while (ok(x, y) && s[x][y] == '1') {
      s[x][y] = '0';
      x++;
      y++;
    }
    y -= 2;
    while (ok(x, y) && s[x][y] == '1') {
      s[x][y] = '0';
      x++;
      y--;
    }
    x -= 2;
    while (ok(x, y) && s[x][y] == '1') {
      s[x][y] = '0';
      x--;
      y--;
    }
    y += 2;
    while (ok(x, y) && s[x][y] == '1') {
      s[x][y] = '0';
      x--;
      y++;
    }
    return true;
  }
  return false;
}
bool check2x2(int x, int y) {
  int t = 0;
  for (int i = (x - 1); i < (x + 3); ++i)
    for (int j = (y - 1); j < (y + 3); ++j)
      if (ok(i, j) && s[i][j] == '1') t++;
  if (t != 4) return false;
  for (int i = (x); i < (x + 2); ++i)
    for (int j = (y); j < (y + 2); ++j)
      if (ok(i, j)) {
        if (s[i][j] == '1') t--;
      } else
        return false;
  return t == 0;
}
bool Type1(int x, int y) {
  int it = 0;
  if (check2x2(x, y)) {
    s[x][y] = s[x + 1][y] = s[x][y + 1] = s[x + 1][y + 1] = '0';
    return true;
  }
  int xx = x, yy = y;
  if (ok(x - 1, y - 1) && s[x - 1][y - 1] == '1') return false;
  int l = 0;
  while (ok(x, y) && s[x][y] == '1') {
    l++;
    if (ok(x - 1, y) && s[x - 1][y] == '1') return false;
    if (ok(x + 1, y) && s[x + 1][y] == '1' && ok(x, y + 1) &&
        s[x][y + 1] == '1' && ok(x, y - 1) && s[x][y - 1] == '1')
      return false;
    y++;
  }
  if (l < 3) return false;
  y--;
  if (ok(x - 1, y + 1) && s[x - 1][y + 1] == '1') return false;
  while (ok(x, y) && s[x][y] == '1') {
    l--;
    if (ok(x, y + 1) && s[x][y + 1] == '1') return false;
    if (ok(x, y - 1) && s[x][y - 1] == '1' && ok(x + 1, y) &&
        s[x + 1][y] == '1' && ok(x - 1, y) && s[x - 1][y] == '1')
      return false;
    x++;
  }
  x--;
  if (l != 0) return false;
  if (ok(x + 1, y + 1) && s[x + 1][y + 1] == '1') return false;
  while (ok(x, y) && s[x][y] == '1') {
    if (ok(x + 1, y) && s[x + 1][y] == '1') return false;
    if (ok(x - 1, y) && s[x - 1][y] == '1' && ok(x, y + 1) &&
        s[x][y + 1] == '1' && ok(x, y - 1) && s[x][y - 1] == '1')
      return false;
    y--;
  }
  y++;
  if (ok(x + 1, y - 1) && s[x + 1][y - 1] == '1') return false;
  while (ok(x, y) && s[x][y] == '1') {
    if (ok(x, y - 1) && s[x][y - 1] == '1') return false;
    if (ok(x, y + 1) && s[x][y + 1] == '1' && ok(x + 1, y) &&
        s[x + 1][y] == '1' && ok(x - 1, y) && s[x - 1][y] == '1')
      return false;
    x--;
  }
  x++;
  if (xx == x && yy == y) {
    while (ok(x, y) && s[x][y] == '1') s[x][y] = '0', y++;
    y--;
    x++;
    while (ok(x, y) && s[x][y] == '1') s[x][y] = '0', x++;
    x--;
    y--;
    while (ok(x, y) && s[x][y] == '1') s[x][y] = '0', y--;
    y++;
    x--;
    while (ok(x, y) && s[x][y] == '1') s[x][y] = '0', x--;
    return true;
  }
  return false;
}
int main() {
  int tests;
  cin >> tests;
  for (int test = (0); test < (tests); ++test) {
    s.clear();
    scanf("%d%d", &n, &m);
    for (int i = (0); i < (n); ++i) {
      scanf("%s", buf);
      s.push_back(buf);
    }
    int ans = 0;
    for (int i = (0); i < (n); ++i) {
      for (int j = (0); j < (m); ++j) {
        if (s[i][j] == '1') {
          if (Type1(i, j) || Type2(i, j)) ans++;
        }
      }
    }
    cout << ans << endl;
  }
  return 0;
}
