#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
template <class T1, class T2>
struct cmpf {
  bool rev;
  inline bool operator()(const pair<T1, T2>& a, const pair<T1, T2>& b) const {
    return (a.first < b.first) ^ rev;
  }
  cmpf(bool b = false) { rev = b; }
};
template <class T1, class T2>
struct cmps {
  bool rev;
  inline bool operator()(const pair<T1, T2>& a, const pair<T1, T2>& b) const {
    return (a.second < b.second) ^ rev;
  }
  cmps(bool b = false) { rev = b; }
};
string to_string(const char& c) { return string(1, c); }
string to_string(const string& s) { return '"' + s + '"'; }
string to_string(const char* s) { return to_string((string)s); }
string to_string(const bool& b) { return (b ? "true" : "false"); }
string to_string(const vector<bool>& v, const string& sep = " ") {
  string s = "[";
  for (int i = 0; i < v.size(); i++) {
    if (i) {
      s += sep;
    }
    s += to_string(v[i]);
  }
  return s + "]";
}
template <size_t N>
string to_string(const bitset<N>& v) {
  string s = "[";
  for (size_t i = 0; i < N; i++) s += v[i] ? '1' : '0';
  return s + "]";
}
template <class T1, class T2>
string to_string(const pair<T1, T2>& p, const string& sep = ",");
template <class T>
string to_string(const T& v, const string& sep = " ") {
  bool first = true;
  string s = "{";
  for (const auto& x : v) {
    if (!first)
      s += sep;
    else
      first = false;
    s += to_string(x);
  }
  return s + "}";
}
template <class T>
string to_string(const T& v, const int& sz, const string& sep = " ") {
  string s = "[";
  for (int i = 0; i < sz; i++) {
    if (i) {
      s += sep;
    }
    s += to_string(v[i]);
  }
  return s + "]";
}
template <class T1, class T2>
string to_string(const pair<T1, T2>& p, const string& sep) {
  return "(" + to_string(p.first) + sep + to_string(p.second) + ")";
}
long long binpow(const long long& x, const long long& p, const long long& mod) {
  assert(mod > 0);
  if (p == 0) return 1;
  if (p == 1) return x % mod;
  if (p & 1) return (binpow((x * x) % mod, p / 2, mod) * x) % mod;
  return binpow((x * x) % mod, p / 2, mod) % mod;
}
template <class T>
void chmn(T& a, const T& b) {
  if (a > b) a = b;
}
template <class T>
void chmx(T& a, const T& b) {
  if (a < b) a = b;
}
void setIO() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
}
int chr[8] = {-1, 0, 1, 0, -1, -1, 1, 1};
int chc[8] = {0, 1, 0, -1, -1, 1, -1, 1};
const long long MOD = 1e9 + 7;
const int INIT = 1001001001;
const int MN = 255;
bool mat[MN][MN];
int N, M;
inline const bool out(int r, int c) {
  return r <= 0 || r > N || c <= 0 || c > M;
}
inline const bool ok(int r, int c, int skip1, int skip2, int n) {
  if (out(r, c) || !mat[r][c]) return false;
  for (int i = 0; i < n; i++) {
    if (i != skip1 && i != skip2) {
      if (mat[r + chr[i]][c + chc[i]]) return false;
    }
  }
  return true;
}
bool side_square(int r, int c, int len) {
  if (!ok(r, c, 1, 2, 4)) return false;
  if (mat[r - 1][c - 1]) return false;
  r++;
  for (int i = 0; i + 2 < len; i++) {
    if (!ok(r, c, 0, 2, 4)) return false;
    r++;
  }
  if (!ok(r, c, 0, 1, 4)) return false;
  if (mat[r + 1][c - 1]) return false;
  c++;
  for (int i = 0; i + 2 < len; i++) {
    if (!ok(r, c, 1, 3, 4)) return false;
    c++;
  }
  if (!ok(r, c, 0, 3, 4)) return false;
  if (mat[r + 1][c + 1]) return false;
  r--;
  for (int i = 0; i + 2 < len; i++) {
    if (!ok(r, c, 0, 2, 4)) return false;
    r--;
  }
  if (!ok(r, c, 2, 3, 4)) return false;
  if (mat[r - 1][c + 1]) return false;
  c--;
  for (int i = 0; i + 2 < len; i++) {
    if (!ok(r, c, 1, 3, 4)) return false;
    c--;
  }
  return true;
}
bool diag_square(int r, int c, int len) {
  if (!ok(r, c, 6, 7, 8)) return false;
  r++;
  c--;
  for (int i = 0; i + 2 < len; i++) {
    if (!ok(r, c, 5, 6, 8)) return false;
    r++;
    c--;
  }
  if (!ok(r, c, 5, 7, 8)) return false;
  r++;
  c++;
  for (int i = 0; i + 2 < len; i++) {
    if (!ok(r, c, 4, 7, 8)) return false;
    r++;
    c++;
  }
  if (!ok(r, c, 4, 5, 8)) return false;
  r--;
  c++;
  for (int i = 0; i + 2 < len; i++) {
    if (!ok(r, c, 5, 6, 8)) return false;
    r--;
    c++;
  }
  if (!ok(r, c, 4, 6, 8)) return false;
  r--;
  c--;
  for (int i = 0; i + 2 < len; i++) {
    if (!ok(r, c, 4, 7, 8)) return false;
    r--;
    c--;
  }
  return true;
}
void solve() {
  cin >> N >> M;
  for (int i = 0; i < N + 5; i++) {
    for (int j = 0; j < M + 5; j++) {
      mat[i][j] = false;
    }
  }
  char c;
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= M; j++) {
      cin >> c;
      mat[i][j] = c == '1';
    }
  }
  long long ans = 0;
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= M; j++) {
      if (mat[i][j]) {
        bool stop = false;
        for (int len = 2; i + len - 1 <= N && j + len - 1 <= M; len++) {
          if (side_square(i, j, len)) {
            ++ans;
            stop = true;
          }
          if (diag_square(i, j, len)) {
            ++ans;
            stop = true;
          }
          if (stop) break;
        }
      }
    }
  }
  cout << ans << '\n';
}
int main() {
  setIO();
  long long T = 1;
  cin >> T;
  while (T--) solve();
  return 0;
}
